读书笔记之《数据结构》---第五章 数组和广义表

本章目录
1.数组的定义
2.数组的顺序表示和实现
3.矩阵的压缩存储
4.广义表定义
5.广义表的存储结构
6.m元多项式的表示
7.广义表的递归算法

数组的定义
和线性表一样,数组中的所有数据元素都必须属于同一个数据类型。
我们可以把二维数组看成是一个定长线性表:它的每一个数据元素也是一个定长线性表。

数组的顺序表示和实现
对于数组一旦规定了它的维数和各维的长度,便可为它分配存储空间,
假设每个数据元素占L个存储单元,则二维数组A中任一元素aij的存储位置为:在这里插入图片描述

矩阵的压缩存储
特殊矩阵:
1.对称矩阵:非零元集中在对角线附近,并对称分布,其余部分都为零元素或某一常数
2.三角矩阵:上三角或下三角都为为零元素或某一常数
压缩方法:特殊矩阵的非零元分布都有一个明显的规律,从而将其压缩存储到一维数组中,并找到非零元在一维数组中的对应关系。

稀疏矩阵:非零元个数很少,且分布没有规律。
稀疏矩阵压缩方法:只存储非零元,用将每个非零元转换成三元组,记录位置和值(i,j,value)。

三元组顺序表:
在这里插入图片描述

稀疏矩阵转置方法:
1.将矩阵的行列值相互交换
2.将每个三元组中的i和j相互交换
3.重排三元组之间的次序
将稀疏矩阵M(该矩阵是用三元表示法表示的矩阵)转置的两种方法:
1.构造矩阵T,T.mu = M.nuT.nu = M.mu,T.tu = M.tu,然后按照M的列号进行循环查找M的非零元中列号相应的非零元,将每一列的非零元转换成T中每一行的非零元。该算法的时间复杂度是O(M.nu * M.tu)算法如下:
在这里插入图片描述
2.在转置前先求得M中每一列非零元的个数和该列第一个非零元在T中的位置。因此需要添加两个向量num和cpot,分别记录非零元个数和第一个非零元的位置。该算法的时间复杂度O(M.nu + M.tu),该方法称为快速转置法。
在这里插入图片描述
在这里插入图片描述

行逻辑链接的顺序表:
在这里插入图片描述

经典矩阵乘法运算:
算法思想:用M的i行与N的每一列相乘,得到Q的第i行,Q的函数等于M的行数,Q的列数等于N的列数。
在这里插入图片描述

稀疏矩阵用三元组表示法表示时的乘法运算:可以免去经典算法中的值为0的乘法步骤。
在这里插入图片描述
算法思想:分别将M中的每个元素与N中符合条件N.i = M.j的元素相乘,也就是将M中的元素乘以N中N.i = M.j的元素。生成Q,设置每行的累加器ctemp,对M中每一行进行一次循环,找到i值与M每行中的每个元素的j值的N中的元素相乘,累加到ctemp[N.j]中,然后将ctemp融合到Q的M.i行中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十字链表:当矩阵的非零元个数和位置在操作过程中变化较大,就适合采用十字链表存储结构。链表中每个非零元含有5个域,除了i、j和e外还需加right指向同一行中下一个非零元,down指向同一列中下一个非零元。
在这里插入图片描述

广义表定义
广义表一般记作 LS = (a1 , a2,a3,…,an),LS是广义表的名称,n是长度。ai可以是单个元素也可以是广义表,称为原子和子表。称第一个元素a1为表头,其余(a2,a3,…,an)组成表尾

3个重要结论:
1.列表的元素可以是子表,子表的元素还可以是子表
2.列表可为其他列表共享
3.列表可以是一个递归表,即列表本身是自己的一个子表

广义表的存储结构
广义表的数据元素有两种结构:原子结点和表结点。
原子结点只需要两个域,标志域和值域
表结点需要三个域,标志域、指示表头的指针域和指示表尾的指针域
标志域表明该结点是表结点还是原子结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

m元多项式的表示
在这里插入图片描述
在这里插入图片描述

广义表的递归算法
求广义表的深度:
在这里插入图片描述
复制广义表:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_25744595/article/details/82986155