数组和广义表
数组
n维数组是线性表的推广,每一行可以看成一个行向量形式线性表,每一列看成一个列向量形式线性表
顺序存储结构;以列序为主序存储/以行序为主序存储
矩阵压缩存储
多个值相同的元素只分配一个存储空间,对0元素不分配存储空间
特殊矩阵:具有许多相同的矩阵元素或者0元素,并且这些相同矩阵元素或者零元素分布具有一定规律性的矩阵
对称矩阵、上(下)三角矩阵、对角矩阵
特殊矩阵压缩存储方法:找出特殊矩阵中值相同的矩阵元素,把那些相同分布、值相同的矩阵元素压缩到一个存储空间
稀疏矩阵:矩阵中非0元素个数相对于矩阵元素来说非常少
存储方式:非零元素以及相应的行和列构成一个三元组(行标,列标,值)
广义表
列表,元素a1,a2,a3……an的有限序列,其中每一个ai或者是原子,或者是一个子表
表头:若LS非空(n>=1),则其第一个元素a1就是表头
表尾:除表头之外的其他元素组成。记作tail(LS)=(a2,……an)
(())长度为1,表头表尾均为()
(a,(b,c))长度为2,由原子a和子表(b,c)构成。表头为a,表尾为((b,c))
广义表长度:为最外层所包含元素的个数
广义表深度:该广义表展开后所含括号数
原子深度为0,空表深度为1
取表头运算GetHead 取表尾运算GetTail
GetHead(LS)=a1 GetTail(LS)=(a2,……an)
广义表是线性表的推广,线性表是广义表的特例
例题【重要】
A=() 列表A是空表,长度为0
B=(e) 列表B只有一个原子e,B的长度为1
C=(a,(b,c,d)) 列表C的长度为2,两个元素分别为原子a和子表(b,c,d)
D=(A,B,C) 列表D的长度为3,3个元素都是列表,将子表的值代入后,D=((),(e),(a,(b,c,d)))
E=(a,E) 递归的表,长度为2,E相当于一个无限的列表E=(a,(a,(a……)))
GetHead(B)=e GetTail(B)=()
GetHead(D)=A GetTail(D)=(B,C)——>再次分解GetHead((B,C))=B GetTail((B,C))=C
重要结论
(1)列表的元素可以是子表,子表的元素还可以是子表……列表是一个多层次结构
(2)列表可以为其他列表所共享,如D中不必列出子表的值,而是通过子表名称引用
(3)列表是一个递归的表,列表可以是其本身的一个子表,如E
注:列表()和(())不同,前者为空表,长度n=0;后者长度n=1,可分解得到表头,表尾均为空表()