数组 矩阵 广义表
5.1 数组
5.1.1 数组的类型
一般研究的就是一维数组和二维数组。
5.1.2 定义和表示方法
一维数组:
(a0,a1,a2,…an)
二维数组:
[(a0,0,a0,1,…,a0,n),
(a1,0,a1,1,…,a1,n),
…
(an-1,0,an-1,1,…,an-1,n-1)]
可以看出二维数组就是元素是一维数组的数组。
二维数组可以行优先存储和列优先存储,同一个元素按照不同的存储顺序存储的位置可能不同。
5.1.3 例题
设二维数组A[6][10],每个数组元素占4个存储单元,若按行优先顺序存放的数组元素A[3][5]的存储地址是1000,求A[0][0]的存储地址。
A[3][5]所在的行之前有3行
第0行,第1行,第2行
每行10个元素;
A[3][5]所在行中位置之前有5个元素;
因此A[3][5]之前的元素个数为:3x10+5=35;
所跨的地址范围为:4x35 =140;
A[0][0]的地址为:1000 - 140 = 860。
5.2 矩阵的压缩存储
5.2.1 矩阵
一般利用二维数组来存储一个矩阵。
5.2.2 特殊矩阵
相同的元素或者零元素在矩阵中的分布存在一定规律的矩阵称之为特殊矩阵,反之称之为稀疏矩阵。
5.2.2.1 对称矩阵
矩阵中的元素满足aij= aji的矩阵称之为对称矩阵(矩阵必须是方阵)。
假设有一个nxn的对称矩阵,第一个元素为a0,0,请用一种存储效率较高的存储方式将其存储在一维数组中。
例题
设矩阵A是一个对称矩阵,为了节省存储空间,将其下三角部分按照行优先存放在一维数组B[0,… n(n+1)/2-1]中, 对于下三角部分中的任一元素aij (i≥j, i和j从1开始取值), 在一 维数组B中的下标k的值是()。
i(i-1)/2 + j - 1
5.2.2.2 三角矩阵
5.2.2.3 三对角矩阵
三对角矩阵的特点是除主对角线以及上下两条带状区域内的元素外,其余元素皆为c(也可为0).
三对角元素的压缩存储表示为:
当i等于1时,带状区域内第一个元素为矩阵中第一个元素,其在一维数组中下标为0;
当i大于1时,第i行之前的元素个数为2+(i-2)x3, 则带状区域内第一个元素X在一维数组中的下标为2+(i-2)x3。
例题
有一个100阶的三对角矩阵M,其元素m(i≤100, j≤100)按行优先次序压缩存入下标从0开始的一维数组N中。元素m30,30在N中的下标是()。
带入公式2+(i-2)x3;
求得带状区域的第一个元素是86,对角线元素为第二个元素,+1 = 87 ;
5.2.3 稀疏矩阵
如果一个矩阵大多数的元素都是0,那么就可以称为稀疏矩阵。
5.2.3.1 三元组表示法
对于一个元素,需要保存的有元素值,行标和列标。
三元组的第一行表示的是矩阵中非0元素的个数,以及存储的矩阵的行和列的值。
5.2.3.2 邻接表表示法
5.2.3.3 十字链表表示法
十字链表第一排的三个域分别代表行数列数和非0元素个数,第二排的两个域分别指向行数组和列数组。
5.3 广义表
广义表就是表元素可以为原子或广义表的一种线性表的扩展结构。
5.3.1 逻辑结构
A=(), A是一个空表,长度为0,深度为1。
B=(d, e), B的元素全是原子,d和e,长度为2,深度为1。 C=(b, (C,d)), C有两个元素,分别是原子b和另一个广义表(C, d), 长度为2,深度为2。
D=(B, C),D的元素全是广义表,B和C,长度为2,深度为3,由此可见一个广义表的子表可 以是其他已经定义的广义表的引用。
E=(a,E),E有两个元素,原子a和它本身,长度为2,由此可见一个广义表可以是递归定义 的。展开E可以得到(a, (a, (,(.).))),是一个无限深的广义表。
广义表的长度:为表中最上层元素的个数。如广义表C长度为2,注意不是3。
广义表的深度:为表中括号的最大层数。求深度时可将子表展开,如广义表D应该展开为((d,e), (b, (C, d)))。深度为3。
表头(Head)和表尾(Tail) :当广义表非空时,第一个元素为广义表的表头,其余元素组成的表是广义表的表尾。
GetHead(D) = B GetTail(D)= ( C )
5.3.2 存储结构
三个域的结点叫广义表结点,第一个域用1来标识,两个域的结点叫元素结点,第一个域用0来标识。