广义表
G L = ( a 1 , a 2 , ⋅ ⋅ ⋅ , a i , ⋅ ⋅ ⋅ , a n ) GL=(a1,a2,···,a_i,···,a_n) GL=(a1,a2,⋅⋅⋅,ai,⋅⋅⋅,an)
广义表的重要特性
- 广义表中的数据元素是有相对次序的
- 广义表的长度定义为最外层包含元素的个数
- 广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
- 广义表可以共享,一个广义表可以被其他广义表共享,这种广义表称为再入表
- 广义表可以是一个递归的表,一个广义表可以是自己的子表。递归表的深度是无穷值,长度是有限值
- 任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表
- 任何一个非空广义表的表尾是除去表头以外剩余所有元素构成的广义表表,必定是子表
广义表的Head()和Tail()运算
- Head()
- 取表头,取出的可能是原子、子表
- 如: L S = ( ( a , b , c ) , ( d , e , f ) , ( ) ) LS=((a,b,c),(d,e,f),()) LS=((a,b,c),(d,e,f),()), H e a d ( L S ) = ( a , b , c ) Head(LS)=(a,b,c) Head(LS)=(a,b,c), H e a d ( H e a d ( L S ) ) = a Head(Head(LS))=a Head(Head(LS))=a
- Tail()
- 取表尾,取出的是一个表
- 如: L S = ( ( a , b , c ) , ( d , e , f ) , ( ) ) LS=((a,b,c),(d,e,f),()) LS=((a,b,c),(d,e,f),()), T a i l ( L S ) = ( ( d , e , f ) , ( ) ) Tail(LS)=((d,e,f),()) Tail(LS)=((d,e,f),()), T a i l ( T a i l ( L S ) ) = ( ( ) ) Tail(Tail(LS))=(()) Tail(Tail(LS))=(())
数组
d维数组的抽象数据类型描述
数组的存储
一维数组的存储
- 任一数组元素
a
i
a_i
ai的存储地址
L
O
C
(
a
i
)
LOC(a_i)
LOC(ai)可由以下公式计算出
- L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) ⋅ k LOC(a_i)=LOC(a_1)+(i-1)·k LOC(ai)=LOC(a1)+(i−1)⋅k
二维数组的存储
- 按行优先存放
- L O C ( a i , j ) = L O C ( a 1 , 1 ) + [ ( i − 1 ) ⋅ n + ( j − 1 ) ] ⋅ k LOC(a_{i,j})=LOC(a_{1,1})+[(i-1)·n+(j-1)]·k LOC(ai,j)=LOC(a1,1)+[(i−1)⋅n+(j−1)]⋅k
- 按列优先存放
- L O C ( a i , j ) = L O C ( a 1 , 1 ) + [ ( j − 1 ) ⋅ m + ( i − 1 ) ] ⋅ k LOC(a_{i,j})=LOC(a_{1,1})+[(j-1)·m+(i-1)]·k LOC(ai,j)=LOC(a1,1)+[(j−1)⋅m+(i−1)]⋅k
特殊矩阵的压缩存储
对称矩阵
只存放下三角部分(含主对角)的元素
k与i,j的关系
-
矩阵A[1…n,1…n]存放在数组B[n(n+1)/2]
-
i ⩾ j , k = i ( i − 1 ) 2 + j − 1 i \geqslant j , k= \cfrac{i(i-1)}{2}+j-1 i⩾j,k=2i(i−1)+j−1
-
i < j , k = j ( j − 1 ) 2 + i − 1 i < j , k= \cfrac{j(j-1)}{2}+i-1 i<j,k=2j(j−1)+i−1
-
-
矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2]
-
i ⩾ j , k = i ( i + 1 ) 2 + j i \geqslant j , k= \cfrac{i(i+1)}{2}+j i⩾j,k=2i(i+1)+j
-
i < j , k = j ( j + 1 ) 2 + i i < j , k= \cfrac{j(j+1)}{2}+i i<j,k=2j(j+1)+i
-
三角矩阵
存放上/下三角区和主对角线的元素后,紧接存储对角线上的常量
上三角矩阵k与i,j的关系
- 矩阵A[1…n,1…n]存放在数组B[n(n+1)/2+1]
- i ⩽ j , k = ( i − 1 ) ( 2 n − i + 2 ) 2 + j − i i \leqslant j , k=\cfrac{(i-1)(2n-i+2)}{2}+j-i i⩽j,k=2(i−1)(2n−i+2)+j−i
- i > j , k = n ( n + 1 ) 2 i>j , k=\cfrac{n(n+1)}{2} i>j,k=2n(n+1)
- 矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2+1]
- i ⩽ j , k = i ( 2 n − i + 1 ) 2 + j − i i \leqslant j , k=\cfrac{i(2n-i+1)}{2}+j-i i⩽j,k=2i(2n−i+1)+j−i
- i > j , k = n ( n + 1 ) 2 i>j , k=\cfrac{n(n+1)}{2} i>j,k=2n(n+1)
下三角矩阵k与i,j的关系
- 矩阵A[1…n,1…n]存放在数组B[n(n+1)/2+1]
- i ⩾ j , k = i ( i − 1 ) 2 + j − 1 i \geqslant j , k=\cfrac{i(i-1)}{2}+j-1 i⩾j,k=2i(i−1)+j−1
- i < j , k = n ( n + 1 ) 2 i<j , k=\cfrac{n(n+1)}{2} i<j,k=2n(n+1)
- 矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2+1]
- i ⩾ j , k = i ( i + 1 ) 2 + j i \geqslant j , k= \cfrac{i(i+1)}{2}+j i⩾j,k=2i(i+1)+j
- i < j , k = n ( n + 1 ) 2 i<j , k=\cfrac{n(n+1)}{2} i<j,k=2n(n+1)
三对角矩阵
非零元素都集中在以主对角线为中心的3条对角线的区域,其他区域元素为零
k与i,j的关系
- 矩阵A[1…n,1…n]存放在数组B[3n-2]
- k = 2 i + j − 3 k=2i+j-3 k=2i+j−3
- 已知k,可得 i = ⌊ k + 1 3 + 1 ⌋ i= \lfloor \cfrac{k+1}{3}+1 \rfloor i=⌊3k+1+1⌋, j = k − 2 i + 3 j=k-2i+3 j=k−2i+3
- 矩阵A[0…n-1,0…n-1]存放在数组B[3n-2]
- k = 2 i + j k=2i+j k=2i+j
- 已知k,可得 i = ⌊ k + 1 3 + 1 ⌋ − 1 i= \lfloor \cfrac{k+1}{3}+1 \rfloor -1 i=⌊3k+1+1⌋−1, j = k − 2 i j=k-2i j=k−2i
稀疏矩阵
- 三元组表(行标,列标,值)
- 十字链表法