dbeaver导出表结构和数据_数据结构教程之数组和广义表习题复习

数组和广义表

  • 1.如何理解数组是线性表的推广

    • 答:数组可以看成是线性表在下述含义上的拓展:线性表中的数据元素本身也是一个线性表。在d(d>=1)维数组中的每个数据元素都受着d个关系的约束,在每个关系中,数据元素都有一个后继元素(除最后一个元素外)和一个前驱元素(除第一个元素外)。
    • 因此。这d个关系中任一关系,就其单个关系而言,仍是线性关系。例如,mxn的二维数组的形式话定义如下:
      A = (D, R)
      其中:
      D = {aij | 0 <=i<=m-1, 0 <=j < = n - 1} // 数据元素的集合
      R = {ROW, COL}
      ROW = {1,j> | 0 <= i <=m - 2, 0 <= j <= n - 1} // 行关系
      COL = {1> | 0 <= i <= m - 1, 0 <= j <= n - 2} // 列关系
  • 2.有三维数组a[0..7, 0...8, 0...9]采用按行序优化存储,数组的起始地址是1000,每个元素占用2个字节,试给出下面结果:

    • LOC(a1,6,8) = LOC(a0,0,0) + [1 * 9 * 10 + 6 * 10 + 8] * 2 = 1000 + 316
    • 数组a所占用存储空间 = 8 * 9 * 10 * 2 = 1440字节
    • 元素a1,6,8的起始地址
    • 数组a所占用的存储空间
    • 答:
  • 3.如果某个一维数组A的元素个数n很大,存在大量重复的元素,且所有元素值相同的元素紧挨在一起,请设计一个压缩存储方式使得存储空间更节省。

    • 答:设数组的元素类型为ElemType,采用一种结构体数组B来实现压缩存储,该结构体数组的元素如下:
      struct
    • 如数组A[] = {1, 1, 1, 5, 5, 6, 6}共有17个元素,对应的压缩存储为:{{1, 3}, {5, 2}, {6, 2}}。从中看出,如果重复元素越多,采用这种压缩存储方式越节省存储空间。
  • 4.一个n阶对称矩阵A采用压缩存储在一维数组B中,则B包含多少个元素?

    • 答:通常B中包含n阶对称矩阵A的下三角和主对角线上的元素,其元素个数为1+2+...+n=n(n + 1)n / 2
  • 5.设nxn的上三角矩阵A[0..n-1, 0..n-1]已压缩到一维数组B[0..m]中,若按列为主序存储,则A[i][j]对应的B中存储位置k为多少,给出推导过程

    • 对于上三角部分或者主对角中的元素A[i]j,按列为主序存储时,前面有0~j-1共j列,第0列有1个元素,第1列有2个元素,...第j-1列有j个元素,所以这j列的元素个数=1+2+...+j=j(j+1)/2;在第j列中,A[i][j]元素前有A[0..i-1, j]共i个元素。所以A[i][j]元素前有j(j+1)/2+i个元素,而B的下标从0开始,所以A[i][j]在B中的位置k=j(j+1)/2+i。
  • 利用三元组存储任意稀疏数组A时,假设其中一个元素和一个整数占用的存储空间相同,问在什么条件下才能节省存储空间。

    • 设稀疏矩阵A有t个非零元素,加上行数rows丶加上列数cols和非零元素个数nums(也算一个三元组),那么三元组顺序表的存储空间总数为3(t+1),若用二维数组存储时占用空间总数为mxn,只有当3(t+1)n即tn/3-1时,采用三元组存储才能节省存储空间。
  • 7.用十字链表存储一个有K个非0元素的m*n的稀疏矩阵,则其总的节点数为多少?

    • 该十字链表有一个十字链表表头节点,MAX(m, n)个行丶列表头节点。另外,每个非0元素对应一个节点,即K个元素节点。所以共有MAX(m, n) + k + 1个节点。
  • 8.求下列广义表运算的结果

    • head[(x, y, z)] = x;
    • tail[((a, b), (x, y))] = (x, y);
    • head[(x, y, z)]
    • tail[((a, b), (x, y))]
    • 注意:为了清楚起见,在括号层次较多时,将head和tail的参数用中括号表示。例如head[G]丶tail[G]分别表示求广义表G的表头和表尾。
  • 9.设定二维数组B[0..m-1, 0..n-1]的数据在行丶列方向上都按从小到大的顺序按序,且整型变量X中的数据在B中存在。设计一个算法,找出一对满足B[i][j]=x的i丶j值。要求比较次数不超过m+n。

    • 若相等,则比较结束;
    • 若X大于右上角元素,则可断定二维数组的最上面一行肯定没有与X相等的数据,下次比较时搜索范围可减少一行;
    • 若X小于右上角,则可断定二维数组的最右面一列肯定不包含与X相等的数据,下次比较时可把最右一列剔除出搜索范围。
    • 从二维数组B的右上角的元素开始比较。每次比较有三种可能的结果:
    • 这样,每次比较可使搜索范围减少一行或一列,最多经过m+n次比较就可找到要求的与X相等的元素。对应的程度如下:
      #include 
  • 10.设计一个算法,计算一个三元组表示的稀疏矩阵的对角线元素之和。

    • 答:对于稀疏矩阵三元组表a,从a.data[0]开始查看,若其行号等于列好,表示是一个对角线的元素,则进行累加,最后返回累加值。算法如下:
      bool diagonal(TSMatrix a, ElemType &sum)
  • 11.设计一个算法Same(g1, g2),判断两个广义表g1和g2是否相同。

    bool Same(GLNode *g1, GLNode *g2)
    • 答:判断广义表是否相同过程是,若g1个g2均为NULL,则返回true;若g1和g2中一个为NULL,另一个不为NULL,则返回false;若g1和g2均不为NULL,若同为原子且原子值相等,则返回Same(g1->link,g2->link),若同为子表,则返回Same(g1->val.sublist, g2->val.sublist)&Same(g1->link, g2->link)的结果,若一个为原子另一个为字表,则返回false。对应的算法如下:
参考:《数据结构教程》
如果你看完觉得这篇文章不错,帮我两件小事
  • 点个在看,让更多人也能看到这篇内容
  • 关注公众号前端应届生,持续为你推送精彩文章49de5bf805861dde447a1bb5fdee0771.png
  • 加我拉你进超级前端交流群,和各大厂的同学一起交流042a7ecdc6594f5ea945b1bc0c48774d.png
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值