【数据结构学习笔记】广义表和数组

广义表

G L = ( a 1 , a 2 , ⋅ ⋅ ⋅ , a i , ⋅ ⋅ ⋅ , a n ) GL=(a1,a2,···,a_i,···,a_n) GL=(a1,a2,,ai,,an)

广义表的重要特性
  • 广义表中的数据元素是有相对次序的
  • 广义表的长度定义为最外层包含元素的个数
  • 广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
  • 广义表可以共享,一个广义表可以被其他广义表共享,这种广义表称为再入表
  • 广义表可以是一个递归的表,一个广义表可以是自己的子表。递归表的深度是无穷值,长度是有限值
  • 任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表
  • 任何一个非空广义表的表尾是除去表头以外剩余所有元素构成的广义表表,必定是子表
广义表的Head()和Tail()运算
  • Head()
    • 取表头,取出的可能是原子、子表
    • 如: L S = ( ( a , b , c ) , ( d , e , f ) , ( ) ) LS=((a,b,c),(d,e,f),()) LS=((a,b,c),(d,e,f),()) H e a d ( L S ) = ( a , b , c ) Head(LS)=(a,b,c) Head(LS)=(a,b,c) H e a d ( H e a d ( L S ) ) = a Head(Head(LS))=a Head(Head(LS))=a
  • Tail()
    • 取表尾,取出的是一个表
    • 如: L S = ( ( a , b , c ) , ( d , e , f ) , ( ) ) LS=((a,b,c),(d,e,f),()) LS=((a,b,c),(d,e,f),()) T a i l ( L S ) = ( ( d , e , f ) , ( ) ) Tail(LS)=((d,e,f),()) Tail(LS)=((d,e,f),()) T a i l ( T a i l ( L S ) ) = ( ( ) ) Tail(Tail(LS))=(()) Tail(Tail(LS))=(())

数组

d维数组的抽象数据类型描述

请添加图片描述

数组的存储

一维数组的存储
  • 任一数组元素 a i a_i ai的存储地址 L O C ( a i ) LOC(a_i) LOC(ai)可由以下公式计算出
    • L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) ⋅ k LOC(a_i)=LOC(a_1)+(i-1)·k LOC(ai)=LOC(a1)+(i1)k
二维数组的存储
  • 按行优先存放
    • L O C ( a i , j ) = L O C ( a 1 , 1 ) + [ ( i − 1 ) ⋅ n + ( j − 1 ) ] ⋅ k LOC(a_{i,j})=LOC(a_{1,1})+[(i-1)·n+(j-1)]·k LOC(ai,j)=LOC(a1,1)+[(i1)n+(j1)]k
  • 按列优先存放
    • L O C ( a i , j ) = L O C ( a 1 , 1 ) + [ ( j − 1 ) ⋅ m + ( i − 1 ) ] ⋅ k LOC(a_{i,j})=LOC(a_{1,1})+[(j-1)·m+(i-1)]·k LOC(ai,j)=LOC(a1,1)+[(j1)m+(i1)]k

特殊矩阵的压缩存储

对称矩阵

请添加图片描述

只存放下三角部分(含主对角)的元素

k与i,j的关系
  • 矩阵A[1…n,1…n]存放在数组B[n(n+1)/2]

    • i ⩾ j , k = i ( i − 1 ) 2 + j − 1 i \geqslant j , k= \cfrac{i(i-1)}{2}+j-1 ij,k=2i(i1)+j1

    • i < j , k = j ( j − 1 ) 2 + i − 1 i < j , k= \cfrac{j(j-1)}{2}+i-1 i<j,k=2j(j1)+i1

  • 矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2]

    • i ⩾ j , k = i ( i + 1 ) 2 + j i \geqslant j , k= \cfrac{i(i+1)}{2}+j ij,k=2i(i+1)+j

    • i < j , k = j ( j + 1 ) 2 + i i < j , k= \cfrac{j(j+1)}{2}+i i<j,k=2j(j+1)+i

三角矩阵

请添加图片描述

存放上/下三角区和主对角线的元素后,紧接存储对角线上的常量

上三角矩阵k与i,j的关系
  • 矩阵A[1…n,1…n]存放在数组B[n(n+1)/2+1]
    • i ⩽ j , k = ( i − 1 ) ( 2 n − i + 2 ) 2 + j − i i \leqslant j , k=\cfrac{(i-1)(2n-i+2)}{2}+j-i ij,k=2(i1)(2ni+2)+ji
    • i > j , k = n ( n + 1 ) 2 i>j , k=\cfrac{n(n+1)}{2} i>j,k=2n(n+1)
  • 矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2+1]
    • i ⩽ j , k = i ( 2 n − i + 1 ) 2 + j − i i \leqslant j , k=\cfrac{i(2n-i+1)}{2}+j-i ij,k=2i(2ni+1)+ji
    • i > j , k = n ( n + 1 ) 2 i>j , k=\cfrac{n(n+1)}{2} i>j,k=2n(n+1)
下三角矩阵k与i,j的关系
  • 矩阵A[1…n,1…n]存放在数组B[n(n+1)/2+1]
    • i ⩾ j , k = i ( i − 1 ) 2 + j − 1 i \geqslant j , k=\cfrac{i(i-1)}{2}+j-1 ij,k=2i(i1)+j1
    • i < j , k = n ( n + 1 ) 2 i<j , k=\cfrac{n(n+1)}{2} i<j,k=2n(n+1)
  • 矩阵A[0…n-1,0…n-1]存放在数组B[n(n+1)/2+1]
    • i ⩾ j , k = i ( i + 1 ) 2 + j i \geqslant j , k= \cfrac{i(i+1)}{2}+j ij,k=2i(i+1)+j
    • i < j , k = n ( n + 1 ) 2 i<j , k=\cfrac{n(n+1)}{2} i<j,k=2n(n+1)
三对角矩阵

非零元素都集中在以主对角线为中心的3条对角线的区域,其他区域元素为零

k与i,j的关系

请添加图片描述

  • 矩阵A[1…n,1…n]存放在数组B[3n-2]
    • k = 2 i + j − 3 k=2i+j-3 k=2i+j3
    • 已知k,可得 i = ⌊ k + 1 3 + 1 ⌋ i= \lfloor \cfrac{k+1}{3}+1 \rfloor i=3k+1+1, j = k − 2 i + 3 j=k-2i+3 j=k2i+3

请添加图片描述

  • 矩阵A[0…n-1,0…n-1]存放在数组B[3n-2]
    • k = 2 i + j k=2i+j k=2i+j
    • 已知k,可得 i = ⌊ k + 1 3 + 1 ⌋ − 1 i= \lfloor \cfrac{k+1}{3}+1 \rfloor -1 i=3k+1+11, j = k − 2 i j=k-2i j=k2i

稀疏矩阵

  • 三元组表(行标,列标,值)

请添加图片描述

  • 十字链表法

请添加图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逃离地狱的恶魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值