数组和广义表
数组和广义表
数组的定义和实现
任意一个数组都可以看成是一个线性表
n 维数组:每个元素是一个 n-1 维数组的线性表
数组的顺序存储(假设数组为 a[m][n][q])
- 行序为主序:低下标优先,
- 列序为主序:高下标优先,
矩阵的压缩存储
对称矩阵(
三角矩阵(对角线上方或下方的元素全都为常数):在起始地址存储这个常数,其余类似对称矩阵处理
带状矩阵
- 特点:非零元素集中在主对角线两侧共 L 条对角线带状区域称为 L 对角矩阵
- 存储方法:只存储带状区域内的元素
- 以对角线的顺序存储,共
个元素,转换公式
- 从上一行主对角线元素
(含)到本行的主对角线元素 (不含)一共最多 L 个元素,共 个元素,计算公式
- 以对角线的顺序存储,共
随机稀疏矩阵
- 特点大多数元素为 0
- 存储方法:存储每一个非零元素 (i,j,
)- 顺序存储:三元表法,结构体数组,每个结构体包含该元素的行,列,大小
- 链式存储:十字正交链表,在行列方向上将元素链接在一起,每一行每一列都组成一个链表,每个元素有两个指针,一个指向该行下一个元素,一个指向该列下一个元素
三元表存储的矩阵的快速转置算法
- 引入两个辅助数组,num[col] 记录 col 列的非零元素的个数,cpot[col] 记录每列的下一个非零元素在转置矩阵的位置,例如 cpot[3] = 4 代表下一个原矩阵第 3 列的非零元素在转置矩阵的序号是第 4 个
- 计算方法:
参考代码文件:Transport_Matrix.h
广义表的定义和实现
广义表:由零个或多个原子或子表组成的有限序列
- 原子:逻辑上不能再分解的元素
- 子表:作为广义表中元素的广义表
线性表是特殊的广义表(当广义表中的元素全都是原子时)
广义表的相关概念
- 长度:表中元素的个数
- 深度:最深的嵌套层数
- 表头:第一个元素
- 表尾:除了第一个元素之外的元素所组成的新的广义表
广义表的表尾一定是广义表
广义表的存储结构
- 头尾链表:两种节点,tag = 1 时为表节点,含有两个分别指向表头和表尾的指针,tag = 0 时为原子节点,只含有一个数据
- 扩展的线性链表:在头尾链表的基础上,给原子节点中加入指向同一层下一个节点的指针
广义表特殊定义的好处:可以使用递归算法
- 求深度:所有元素最大深度 + 1
- 复制广义表:原子节点复制原子,表节点递归复制表头和表尾
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!