C++(数据结构复习篇)(数组【压缩】|广义表)的概念和相关算法)


多维数组的定义格式

特点:结构固定

成功定义后,维数和维界都不再改变

基本操作:初始化 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行就是用来描述横纵长度和非零元素个数的
0663
11212
2139
331-3

 三元组法(又称有序的双下标法)

优点:非零元素在表中按行序有序存储,便于进行依行顺序处理的矩阵运算

缺点:不能随机存取,如果按行号取其中一行非零的元,就需要从头开始找

待继续整理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值