数据结构~数组+广义表

数据结构~数组+广义表

1、数组:

1-1:数组的定义

这里只要记得数据结构里的数组,是个逻辑结构,
不是c++或者java里的物理结构,
但是可以用物理结构表示出来,
不管几维数组,都能看成一个线性表
在这记录一个多维数组例子:

定义某个学校,
有15个学院,
每个学院分最多5个系,
每个系最多有4个方向,
每个方向最多8个班,
每个班最多50个学生:
Student[][][][][] information 
= new Student[16][6][5][9][51];
对于这么个5维数组,可以设计学生学号:
15个学院,分出来两位来代表学院,01~15
5个系:1~5
4个方向:1~4
8个班:1~8
50个学生:01~50

所以学号可以表示为为:01111011554850
要是在考录入学年份啥的,也可以再加维度,
要想查询学号为0111101的信息只需:
String ID="#0111101";
information[ID.substring(1,3)]
[ID.charAt(3)]
[ID.charAt(4)]
[ID.charAt(5)]
[ID.subString(6,8)];
这里只是便于看,没把字符转成int类型

以下中的所有logic(0,0)都是代表数组中的第一个元素的逻辑地址

1-2:数组的顺序储存

数组一般不做插入或者删除操作(这里说的是分配的空间内存),也就是说,一旦建立了数组,里面的容量和元素之间的关系就不再变化。因此使用顺序储存更为合适。
这里有两个划分:以行序为主序、以列序为主序。
设有m行n列的二维数组A[0…m-1,0…n-1],每个位置占用空间为L:
行序为主序时:logic(i,j)=logic(0,0)+(ni+j)L
行序为主序时:logic(i,j)=logic(0,0)+(mj+i)L
这里还可以继续扩展到n为数组,反正就是记着把每一维都加完,再加最内的那一维的数就OK。

1-3:特殊矩阵的压缩存储

在同一矩阵中可能有很多重复值,或者0值,这时候为了减少空间占用,可以进行压缩,
即相同元素只分配一个储存空间,下面总结记录一下一些可压缩的矩阵:
注意,以下储存包含行列个数(n和m)

1-3-1:对称矩阵
顾名思义,即a[i,j]==a[j,i],(注意这里研究的是方阵)
此时只需要分配一半再加上对角线的一半的空间,即:(n*n+n)/2的空间即可
行序为主序的下三角逻辑位置的计算:
logic(i,j)=logic(0,0)+i(i-1)/2+j-1 (i>=j)
由于a[i,j]=a[j,i],所对于上半个三角(i<j时),只需要把这个公式里的i和j对换即可。

1-3-2:三角矩阵
这个就是一半三角+一半确定常数C,更准确点说是:除去对角线的其中一半,剩余全部是常数C
那么就要分配(n*n+n)/2+1的空间(那个1用来储存常数C)
下三角:logic(i,j)=logic(0,0)+i(i-1)/2+j-1 (i>=j)
logic(i,j)=logic(0,0)+n(n+1)/2 (i<j,即常数放到逻辑位置的最后一个空间)
上三角:logic(i,j)=logic(0,0)+(2n-i+2)(i-1)/2+(j-i) (i<=j)
logic(i,j)=logic(0,0)+n(n+1)/2 (i>j,即常数放到逻辑位置的最后一个空间)

1-3-3:对角矩阵
就是除了主对角线上和直接在对角线上下方若干条对角线上的元素之外,所有其他元素都是0,
logic(i,j)=logic(0,0)+((n-1)*i+j-n),这里的n代表行最大元素个数

1-3-4:稀疏矩阵
压缩存储稀疏矩阵的方法是:只存储矩阵中的非 0 元素,
与前面的存储方法不同,稀疏矩阵非 0 元素的存储需同时存储该元素所在矩阵中的行标和列标。
这里就可以定义一个结构体,用来存储这些信息

2、广义表:

广义表的定义啥的就不记录了,这里记录一下它的表头和表尾。一对确定的表头和表尾可唯一确定广义表。

表头 : 是非空广义表的第一个元素,可以是单原子,也可以是一个子表
表尾: 去除表头,剩余的所有元素构成的广义表。!!!注意,表尾一定是广义表,也就是一定是被括号括着

另外,只有非空表才有表头和表尾。

广义表的深度: 就是看最底层表在哪一层,就是其深度
广义表的广度: 就是看最开始的表的元素个数(此元素可为原子可为子表)

所以对于广义表的储存来说,元素有两种(原子或者列表)
对于原子元素而言需要存储:标志域+值域
对于列表元素而言需要存储:标志域+表头指针域+表尾指针域
可以用结构体+联合体可以方便的定义出来:

struct GLNode{
	int tag;	//标志域:0原子结点  1表结点
	union{
		char data;	//数据元素
		struct atom{
			GLNode *hp, *tp;	//表头、表尾指针
		} ptr;	//头尾指针域
	};
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值