数组的顺序存储
例:设有一-个二维数组A[m][n]按行优先顺序存储,假设A[0][0]存
放位置在644(10),A[2][2]存放位置在676(10), 每个元素占一个空间,
问A[3][3](10)存放在什么位置? (脚注10表示用10进制表示。)
设数组元素A[i][j]存放在起始地址为Loc ( i, j)的存储单元中
Loc(2,2)=Loc(0,0)+2n+2=644+**2n+2**=676.
n=(676-2-644)/2=15
Loc(3,3)=Loc(0,0)+3*15+3=644+45+3=692.
矩阵的压缩存储——特殊矩阵
不适宜常规二维数组存储的矩阵:值相同的元素很多,且呈某种规律分布;零元素多。
压缩存储:为多个相同的非零元素,只分配一个存储空间;对零元素不分配存储空间。
特殊矩阵:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵(非零元素个数较少)
对称矩阵
a ij = a ji
【存储方法】只存储下(或上)三角(包括主对角线)的数据元素,占n(n+1)/2个元素空间
某个元素前面有多少个元素,个数就是该元素在一维数组中的下标
a nj =(n - 1)*n / 2 + j (j从0开始)
三角矩阵
对角线以下或以上的数据元素(不包括对角线)全部为常数c。
对角矩阵(带状矩阵)
非零元素集中在以主对角线为中心的带状区域中,区域外的值全为0
【存储方法】二维矩阵
矩阵的压缩存储——三元组顺序表
稀疏矩阵的顺序存储结构
三元组(i,j,a ij)唯一确定矩阵的一个非零元素
为更可靠描述,再加一个总体信息在下标为0的位置存储:总行数,总列数,非零元素的总个数
优点:非零元在表中按行序有序存储,便于进行依行顺序处理的矩阵运算
缺点:不能随机存取。若按行号存取某一行的非零元,需要从头开始进行查找
矩阵的压缩存储——行逻辑链接的顺序表
矩阵的压缩存储——十字链表
稀疏矩阵的链式存储结构
优点:灵活地插入因运算而产生的新的非零元素,删除新元素,实现矩阵的各种运算
每一个非零元素用一个节点表示:
该节点除了(row,col,value)以外,还有两个域:
right:链接同一行的下一个非零元素
down:链接同一列的下一个非零元素
行头指针:指向每一行的第一个非零元素;
列头指针:指向每一列的第一个非零元素
广义表
线性表中每一个元素的类型都是相同的,
而广义表中每一个元素的类型不一定相同,每一个元素可以是一个原子(单一字符),也可以是一个广义表。
广义表可以是一个递归的表,递归表的深度是无穷值,长度是有限值
表头:若广义表非空,第一个元素就是表头
(表头可用是原子,也可以是子表)
表尾:除表头之外的其他元素组成的表。
(表尾不是最后一个元素,而是一个子表)
长度:最外层包含的元素个数
深度:广义表展开后包含括号的重数
原子深度为0,空表深度为1