首页 > 其他分享 >【数组、特殊矩阵的压缩存储】

【数组、特殊矩阵的压缩存储】

时间:2024-07-11 21:58:28浏览次数:11  
标签:存储 int 元素 矩阵 arr 数组名 数组

目录

一、数组

概述:数组是一个集合,用于存放相同数据类型的元素

1. 特点一: 数组中的每个数据元素具有相同的数据类型;
2. 特点二: 数据占用一段连续的内存空间

1.1、一维数组

1.1.1 、一维数组的定义方式

  1. 只能用数字,字母和下划线命名,且不能用数字作为开头,注意数组名不要与其他变量名重复;
  2. 数组的下标从0开始。
    一维数组的三种定义方式:
    第一种:
//数据类型 数组名[数组长度];
int main(){
    int arr[10];//定义一个长度为10的数组,数组元素为int型
    //使用数组下标对数组元素进行访问
    arr[0] = 10;//数组第一个元素的下标为0
    arr[2] = 20;
    arr[9] = 20;//数组最后一个元素的下标为9,对于长度为i的数组,最后一位元素的下标即为i-1
}

注意:定义数组时,若未给定数组元素的初始值,则必须指定数组的长度,否则提示错误,因为编译时需要分配空间,数组长度未知的话,无法进行分配。
第二种:

//数据类型 数组名[数组长度] = {值1, 值2,...};
int main(){
    int arr[10] = {1, 2, 3, 4};//未设定初始值的后6位元素默认为0
}

注意: 数组初始化时,若大括号{}内的元素个数小雨定义的数组长度,则剩余的数组元素默认为0。
第三种:

//数据类型 数组名[] = {值1, 值2, ...};
int main(){
    int arr[] = {1,2,3,4,5,6,7,8,9,10};//数组长度为10
}

注意: 定义数组元素时,数组可以不用指定数组长度,数组长度由所定义元素的数量决定。

1.1.2、一维数组的数组名

作用一: 统计数组所占用的内存空间、数组中单个数据元素所占用的内存空间、数组的长度,如下:

#include<iostream>
using namespace std;

int main(){
    int arr[10];
    cout<<"数组arr用内存空间为"<<sizeof(arr)<<endl;//40
    cout<<"数组arr中单个元素占用内存空间为:"<<sizeof(arr[0])<<endl;//4
    cout<<"数组长度为:"<<sizeof(arr)/sizeof(arr[0])<<endl;//10
    return 0;
}

作用二: 获取数组在内存中的地址,如下:

int main(){
    int arr[10];
    cout<<arr<<endl;//获取数组的首地址
    cout<<&arr[0]<<endl;//获取数组的首地址
    cout<<&arr<<endl;//获取整个数组的地址
    return 0;
}

注意: arr/&arr[0]和&arr虽然数值相同,但是含义不同!&数组名表示指针,对程序做出如下变化:

#include<iostream>

using namespace std;

int main() {
	int arr[10];
	cout << "数组长度为:" << sizeof(arr) << endl;
	cout << "" << sizeof(arr[0])<< endl;
	cout << "首地址为:"<<arr<<endl;
	cout << "地址为:" << arr+1<< endl;//与之前相差4
	cout << "首地址为:" << &arr[0] << endl;
	cout << "数组地址为:" << &arr << endl;
	cout << "地址为:" << &arr +1<< endl;//与之前相差了40
	return 0;
}

运行结果为:
在这里插入图片描述
注意:

  1. 数组名是常量,不能进行赋值,否则会报错;

1.2、二维数组

1.2.1、二维数组的定义方式

二维数组有四种定义方式;

  1. 数据类型 数组名[行数][列数];
  2. 数据类型 数组名[行数][列数] = {数据1, 数据2, 数据3};
  3. 数据类型 数组名[行数][列数] = {{数据1, 数据2}, {数据3, 数据4},{数据5, 数据6}};
  4. 数据类型 数组名[][列数] = {数据1, 数据2, 数据3, 数据4};
    第3种定义方式最直观,可以提高代码的可读性;
    第2种和第4种要根据二维数组的列数推断数组元素**(可以省略行数,不能省略列数)**;
    定义二维数组时,若已经初始化数据,可以省略行数。
    示例如下:
#include<iostream>

using namespace std;

int main() {
    int arr[][2] = { {1,2},{4,5} };
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
        for (int j = 0; j < sizeof(arr[i]) / sizeof(arr[i][0]);j++) {
            cout << arr[i][j] << "";
        }
        cout << endl;
    }
    return 0;
}

运行结果为:
在这里插入图片描述
注意cout时的格式!

1.2.2、二维数组的数组名

二维数组名称的作用:

1. 计算二维数组所占内存空间;

    cout << "二维数组所占空间为:" <<sizeof(arr) <<endl;
    cout << "二维数组中第1行所占空间为:" << sizeof(arr[0]) << endl;
    cout << "二维数组中某个元素所占空间为:" << sizeof(arr[0][1]) << endl;

运行结果为:
在这里插入图片描述

2. 计算二维数组的行数和列数

求行数:sizeof(arr)/sizeof(arr[0]);//即数组元素总数/每一行的元素数
求列数:sizeof(arr[0])/sizeof(arr[0][0])

3. 获取二维数组中的相关地址

二维数组首地址:arr[0]或者&arr[0][0]
二维数组第一个元素的地址:arr[0]或&arr[0][0]
二维数组第一行的地址:arr或arr[0]或arr+0或*(arr+0)
二维数组第i行的地址:arr[i]或&arr[0]+i或*(arr+i)
二维数组第i行首元素的地址:arr[i]或arr+i或&arr[0]+i或*(arr+i)
二维数组第i行第j列元素的地址:&arr[i][j]或*(arr+i)+j

4. 通过指针解引用访问或操作某元素*(*(arr+i)+j)

二、对称矩阵的压缩存储

对称矩阵的矩阵压缩:
若n阶方阵中任意一个元素在这里插入图片描述都有在这里插入图片描述,则称该矩阵为对称矩阵,对于对称矩阵,只须存储对角线+下三角区。若按照优先原则将各元素存入一维数组中,即在这里插入图片描述存入数组在这里插入图片描述中,那么数组在这里插入图片描述共有在这里插入图片描述个元素。对于k,有:
在这里插入图片描述
在这里插入图片描述

三、三角矩阵的压缩存储

  1. 下三角矩阵:除了主对角线和下三角区,其余的元素都相同;
  2. 上三角矩阵:除了主对角线和上三角区,其余的元素都相同。
  3. 压缩存储策略:按行优先原则将主对角线+下三角区存入一维数组中,并在最后一个位置存储常量,即在这里插入图片描述存入数组在这里插入图片描述中,那么数组在这里插入图片描述共有在这里插入图片描述个元素。对于k,有:
    在这里插入图片描述
    在这里插入图片描述

四、三对角矩阵的压缩存储

三对角矩阵:又称为带状矩阵:当在这里插入图片描述时,有在这里插入图片描述。对于三角矩阵,按行优先原则,只存储带状部分,即在这里插入图片描述存入数组在这里插入图片描述中,那么k=2ij - 3。若一直数组下标k,则i =
在这里插入图片描述

五、稀疏矩阵的压缩存储

稀疏矩阵的非零元素远远少于矩阵元素的个数,压缩存储策略:

  1. 三元数组<行, 列,值>
i(行)j(列)v(值)
134
165
223
249
356
422

注意:此处的行列下标从1开始。

  1. 十字链表
    在这里插入图片描述

标签:存储,int,元素,矩阵,arr,数组名,数组
From: https://blog.csdn.net/Pumpkin_O/article/details/140351828

相关文章

  • C语言大端存储和小端存储到底有什么区别? 结尾详细题目加深理解
    一.为什么有大端小端模式?        大端模式(Big-endian)和小端模式(Little-endian)是计算机科学中数据存储的一种方式,它们指的是多字节数据类型(如整数、浮点数等)在内存中的字节序(byteorder)。这两种模式的主要区别在于数据的最高有效字节(MSB)和最低有效字节(LSB)的存储位置。......
  • 短视频平台搭建矩阵系统源码(搭建技术开发分享)
    #短视频矩阵#矩阵系统#矩阵源码搭建 技术自研框架开发背景:抖音账号矩阵系统是一种基于数据分析和管理的全新平台,能够帮助用户更好地管理、扩展和营销抖音账号,那矩阵的顾名思义就是可以批量话的制作和生成,来完成自己的需求和任务。//视频批量剪辑模式    $video......
  • 矩阵系统被平台限制后的重大更新
    #矩阵系统#矩阵OEM#矩阵源码 矩阵系统,一个强大的工具,我们可以用它来解决各种问题。在数据分析、人工智能和机器学习等领域,矩阵系统发挥着重要的作用。通过它,我们可以获得强大的计算能力和数据处理能力,让我们的工作更加高效和准确。"在这个例子中,我们主要做了以下几件事:......
  • 矩阵系统有什么优点?
    #矩阵贴牌#矩阵系统#矩阵源码矩阵系统有许多优点,主要包括:&nbsp;1.更高的灵活性:矩阵系统通常更具灵活性,可以适应不断变化的环境和需求。&nbsp;2.更高的生产力:矩阵系统通常采用先进的软件和硬件技术,可以更高效地处理数据和信息,从而提高生产力。&nbsp;3.更好的协作:矩阵系......
  • 573、基于51单片机的温度控制(制冷,存储,查询)
    完整资料或定制滴滴我(有偿)见文末。目录一、设计功能二、Proteus仿真三、原理图四、程序源码五、资料包括一、设计功能温度控制阀门制冷1、测量环境温度,如果温度过高,则打开阀门释放冷气2、记录阀门打开时间和打开时长3、具有查询功能二、Proteus仿真三......
  • 代码随想录算法训练营第六天 | Python | LeetCode242.有效的字母异位词、LeetCode349.
    哈希表理论https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html一般哈希表都是用来快速判断一个元素是否出现集合里。数组/set/mapLeetCode242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagr......
  • C++冒泡排序(使用vector动态数组)
    #include<iostream>#include<vector>usingnamespacestd;voidsort(vector<int>&a){  constintsize=a.size();  inttemp;  intflag=1;  while(flag==1)  {  flag=0;  for(inti=0;i<size;++i)  {   if(a[i]>......
  • PTA 7-2 数组循环左移--C++
    本题思路:本题可以用数组或者指针来解决问题,本题我们如果我们用数组来解决问题的话,数组循环左移,就相当后面的数组右移过来,如i位置的就相当于i+m的位置的数组,大概这样的思路,就没有问题了#include<iostream>usingnamespacestd;intmain(){intn,m;cin>>n>>m;......
  • 数组的用法
    关于数组就是讲一组数据写入在一个组合当中举例intarr1[]=newint[]{1,2,3,4}int数据类型arr1变量名(注意此处后面要加()这个是固定格式newint[]固定格式{数据的内容要用,隔开}当然也可以写成这样intarr1[]={1,2,3,4}两者的效果一样均可以使用,具体看自己这么写......
  • 基于EF Core存储的国际化服务
    前言.NET官方有一个用来管理国际化资源的扩展包Microsoft.Extensions.Localization,ASP.NETCore也用这个来实现国际化功能。但是这个包的翻译数据是使用resx资源文件来管理的,这就意味着无法动态管理。虽然官方有在文档中提供了一些第三方管理方案,但是都不太方便。其中一个是基于......