数组和广义表

数组和广义表

数组的定义和实现

任意一个数组都可以看成是一个线性表

n 维数组:每个元素是一个 n-1 维数组的线性表

数组的顺序存储(假设数组为 a[m][n][q])

  • 行序为主序:低下标优先,a[i][j][k]=a+i×m+j×n+k
  • 列序为主序:高下标优先,a[i][j][k]=a+k×q+j×n+m

矩阵的压缩存储

对称矩阵(aij=aji):只存储主对角线及其上方或下方的元素

三角矩阵(对角线上方或下方的元素全都为常数):在起始地址存储这个常数,其余类似对称矩阵处理

带状矩阵

  • 特点:非零元素集中在主对角线两侧共 L 条对角线带状区域称为 L 对角矩阵
  • 存储方法:只存储带状区域内的元素
    • 以对角线的顺序存储,共 L×n 个元素,转换公式

    {inew=ijjnew=j|ij|(L1)/2

    • 从上一行主对角线元素 ai1,i1(含)到本行的主对角线元素 ai,i(不含)一共最多 L 个元素,共 (n1)L+1 个元素,计算公式

    {k=(i1)L+(ji)|ij|(L1)/2

随机稀疏矩阵

  • 特点大多数元素为 0
  • 存储方法:存储每一个非零元素 (i,j,aij)
    • 顺序存储:三元表法,结构体数组,每个结构体包含该元素的行,列,大小
    • 链式存储:十字正交链表,在行列方向上将元素链接在一起,每一行每一列都组成一个链表,每个元素有两个指针,一个指向该行下一个元素,一个指向该列下一个元素

三元表存储的矩阵的快速转置算法

  • 引入两个辅助数组,num[col] 记录 col 列的非零元素的个数,cpot[col] 记录每列的下一个非零元素在转置矩阵的位置,例如 cpot[3] = 4 代表下一个原矩阵第 3 列的非零元素在转置矩阵的序号是第 4 个
  • 计算方法:cpot[1]=1,cpot[col]=cpot[col1]+num[col1](2colm)

参考代码文件:Transport_Matrix.h


广义表的定义和实现

广义表:由零个或多个原子或子表组成的有限序列

  • 原子:逻辑上不能再分解的元素
  • 子表:作为广义表中元素的广义表

线性表是特殊的广义表(当广义表中的元素全都是原子时)

广义表的相关概念

  • 长度:表中元素的个数
  • 深度:最深的嵌套层数
  • 表头:第一个元素
  • 表尾:除了第一个元素之外的元素所组成的新的广义表

广义表的表尾一定是广义表

广义表的存储结构

  • 头尾链表:两种节点,tag = 1 时为表节点,含有两个分别指向表头和表尾的指针,tag = 0 时为原子节点,只含有一个数据
  • 扩展的线性链表:在头尾链表的基础上,给原子节点中加入指向同一层下一个节点的指针

广义表特殊定义的好处:可以使用递归算法

  • 求深度:所有元素最大深度 + 1
  • 复制广义表:原子节点复制原子,表节点递归复制表头和表尾
posted @   DrinkLessMilkTea  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示