多维数组的定义格式
特点:结构固定
成功定义后,维数和维界都不再改变
基本操作:初始化 InitArry(&A,n,bound1,boundn) //构造数组A
//bound是每个维的长度
销毁 Destroy(&A)
取元素(A,&e,index1,...indexn)//取出数组中的元素
//index为每个维度的坐标
修改元素值(A,&e,index1,...,indexn)//给数组元素赋值
二维数组可以理解为:一维数组中,元素又是一维数组
typedef int array[2][2];//定义了一个int类型的二维数组类型
array a;//此时就依靠上述的说明,定义出一个名字为a的两行两列的一个2维数组
//并且每个元素的类型是int
typedef int arr[2];
typedef arr array2[2];//将一维数组作为元素,再套进一维数组
array2 b;//此时依靠上述的说明,也是产生了一个二维数组
线性表结构是数组结构的一个特例(线性表是一维的)
数组结构是线性表结构的扩展(可以多维度)
n维数组的抽象数据类型:
对象:仅有(J和D)即相应维度的位置和所存的DATA
j_1 === 第一维的位置
j_2 === 第二维的位置
j.....到n维度
数据关系:即j_1,j_2....与DATA的关系即对应坐标和具体元素值的关系
多维数组的存储方式
存储:存储的物理层面上是一整串连续的内存,因此多维数组最终落户到内存中依旧会变成一维的结构,只能依靠映射,在印象层面构成立体
存储方式:顺序存储结构————因为大多数操作都是改动和取用,一般不插入删除
多维数组的寻址映射:
二维数组
要通过一维的内存找到多维数组中的对应的元素,就要将内存中的位置和元素的(多维坐标)构建关系
一、先了解是按照什么方式进行的存储:
- 行序为主序:(底下标【左边的】优先):C,JAVA,BASIC,PASCAL,COBOL
- 列序为主序:(高下标优先)
二、因此:寻找【0,1】
即green = base + ( 0 * 4 + 1 ) L (即把前面元素的个数算出来*数据类型大小+基地址)
三维数组
映射:
同理可得:先排去页码,再排去行数,再排去同行的列数
假如需要寻找[3,2,3]实际上是[2,1,2]由0开始存(公式)
pa[3,2,3] = base + [ (2) * l * r + (1) * r + (2) ] * L元素大小
易错注意点
此r 和 l 并非指代行数和列数,而是以行序为主序的
r是第二维的长度(4),l是第三维的长度(3)
多维的数组也如同上述推论一样映射即可
特殊矩阵的压缩:
使用压缩的原因:假若老老实实的存储的时候,有效的内容仅仅占少部分,则很丫的难过
(存储密度)δ = 有效元素/元素*位置————最理想的时候是1
如果密度太小,则该矩阵就会浪费太多的空间
因此需要压缩
可压缩的矩阵类型
多个数据元素的值都相同:
- 则只分配一个元素的存储空间(将多个位置映射到一个内存中)
- 零元素不占空间(可能映射不到的,一律归零)
具体可压缩的类型:
- 对称压缩
- 对角压缩
- 三角矩阵
- 稀疏矩阵(密度小于5%)
对称矩阵
共占用刚好是等差数列:1,2,3,4,......,n
则等差数列的求和公式:S = n(a_n+a_1)/2 ------------ 此处是15
因由0开始,则一直排队到n(a_n+a_1)
所以第n行,表上序号是第n-1,因此
- 因此,当 j <= i的时候,即在下三角,则直接套公式
- 当j>i的时候,是上三角,需要将j 和 i的值反过来套到公式中
三角矩阵
三角矩阵的压缩存储:
特点:对角线以下(或者以上)的数据元素(不包括对角线)全部为常数C
对角矩阵特点及压缩存储方式:
理解记忆:就是将重复出现的常数,合并到一个格子内,当搜寻的范围超出了有效范围,就统一归到多开辟出来的那个空间(存的是常数)——相当于这个常数被映射到了半个具有相同常数的三角形中
如果在有效范围内的话,提取公式如上
对角矩阵(带状矩阵)的特点和映射方式
形如
以上的分类:根据对角线的条数进行命名(一、三、五)
主对角线:存在0行处,作为基准
在主对角线上方的对角线,存入0的上端-1处,并列往后一排
同理如图可得
但是暂时还没学怎么映射和提取
稀疏矩阵:特点及压缩存储(三元组法)
当δ < 0.05的时候称为稀疏矩阵
因此使用三元组(横坐标,纵坐标,元素值)以及维数(纵横的长度)
通常在表头上加入(总行数|总列数|非零数)
此表格中,第0行就是用来描述横纵长度和非零元素个数的
0 6 6 3 1 1 2 12 2 1 3 9 3 3 1 -3 三元组法(又称有序的双下标法)
优点:非零元素在表中按行序有序存储,便于进行依行顺序处理的矩阵运算
缺点:不能随机存取,如果按行号取其中一行非零的元,就需要从头开始找
待继续整理