数据结构期末复习(8)

目录

1. 在单链表中要在已知结点 p 之前插入一新结点,仍需找到 ____,其时间复杂度为 ____,而在双链表中完成同样操作其时间复杂度为 ____。

2. 在 HQ 的链队中,判定只有一个结点的条件是 ____。

3. 含 n 个元素的顺序表:

4. 一个算法的效率可分为 ____ 和 ____。

5. 设有一稠密图 G,则 G 采用 ____ 存储较省空间。

6. 在 n 个结点的单链表中要删除已知结点 p,需找到 ____,其时间复杂度为 ____。

7. 深度为 k 的完全二叉树至少有 ____ 个结点,至多有 ____ 个结点。若按自上而下从左到右次序给结点编号(从 1 开始),则编号最小的叶子结点的编号是 ____。

8. 线性结构中元素之间存在 ____ 关系,树形结构中元素之间存在 ____ 关系,图形结构中元素之间存在 ____ 关系。

9. 数据的运算最常用的有五种,它们分别是 ____ 和 ____。

10. 一棵含有 n 个结点的完全二叉树,它的高度是 ____。

附加内容:循环队列的存储设计


1. 在单链表中要在已知结点 p 之前插入一新结点,仍需找到 ____,其时间复杂度为 ____,而在双链表中完成同样操作其时间复杂度为 ____

  • 正确答案:

    1. p 的直接前驱
    2. O(n)
    3. O(1)
  • 答案解析: 在单链表中,要在已知结点 p 之前插入新结点,必须先找到结点 p 的直接前驱,这需要遍历链表,时间复杂度为 O(n)。而在双链表中,每个结点都包含指向前驱的指针,因此可以直接访问 p 的前驱,插入操作的时间复杂度为 O(1)。

  • 知识点讲解:

    单链表与双链表的插入操作:

    • 单链表(Singly Linked List):

      • 每个结点包含数据部分和指向下一个结点的指针。
      • 插入操作需要找到目标结点的前驱结点。
      • 查找前驱结点的时间复杂度为 O(n)。
    • 双链表(Doubly Linked List):

      • 每个结点包含数据部分、指向下一个结点和前驱结点的指针。
      • 插入操作可以直接访问前驱结点,无需遍历。
      • 插入操作的时间复杂度为 O(1)。
  • 知识点总结表格:

    知识点解释
    单链表每个结点有一个指向下一个结点的指针,插入操作需找到前驱结点
    双链表每个结点有指向前驱和后继结点的指针,插入操作可直接访问前驱结点
    时间复杂度单链表插入操作为 O(n),双链表插入操作为 O(1)
    插入操作步骤单链表需遍历找到前驱,双链表直接访问前驱后插入

2. 在 HQ 的链队中,判定只有一个结点的条件是 ____

  • 正确答案:

    • HQ->front == HQ->rear
  • 答案解析: 当队列的前指针(front)和后指针(rear)指向同一个结点时,说明队列中只有一个结点存在。

  • 知识点讲解:

    链队(链式队列)的判定条件:

    • 队空条件: front == rear 并且队列为空。
    • 队满条件(若使用循环队列): (rear + 1) % m == front
    • 单一结点条件:front == rear 且队列不为空时,说明队列中只有一个结点。
  • 知识点总结表格:

    知识点解释
    链队(链式队列)基于链表实现的队列结构,具有队首和队尾指针
    队空条件front == rear,且队列为空
    队满条件(rear + 1) % m == front(适用于循环队列)
    单一结点条件front == rear,且队列不为空

3. 含 n 个元素的顺序表:

  • 顺序查找法的平均查找长度为:(n + 1) / 2

  • 二分查找法的平均查找长度为:((n + 1) * log(n + 1)) / (n - 1)

  • 分块查找法(顺序查找块)平均查找长度为:(s + 2s + n) / (2s)

  • 分块查找法(二分查找块)平均查找长度为:log₂(n/s + 1) + 1/2

  • 哈希表查找法平均查找长度为:1 + c/2(其中 c 为装填因子)

  • 答案解析:

    • 顺序查找法(Linear Search): 平均情况下需要查找 (n + 1) / 2 次。
    • 二分查找法(Binary Search): 在有序表中,平均查找长度为 ((n + 1) * log(n + 1)) / (n - 1)
    • 分块查找法(Block Search):
      • 顺序查找块的平均查找长度为 (s + 2s + n) / (2s)
      • 二分查找块的平均查找长度为 log₂(n/s + 1) + 1/2
    • 哈希表查找法(Hash Table Search): 平均查找长度为 1 + c/2,其中 c 是装填因子。
  • 知识点讲解:

    查找算法的平均查找长度(ASL):

    • 顺序查找法:

      • 在未排序或有序表中均可使用。
      • 平均查找长度:(n + 1) / 2
    • 二分查找法:

      • 仅适用于有序表。
      • 每次比较将查找范围缩小一半。
      • 平均查找长度:((n + 1) * log₂(n + 1)) / (n - 1)
    • 分块查找法:

      • 将顺序表分成多个块,每个块内部有序。
      • 顺序查找块: 先顺序查找块,再顺序查找元素。
        • 平均查找长度:(s + 2s + n) / (2s)
      • 二分查找块: 先顺序查找块,再二分查找元素。
        • 平均查找长度:log₂(n/s + 1) + 1/2
    • 哈希表查找法:

      • 通过哈希函数将关键字映射到表中位置。
      • 平均查找长度:1 + c/2,其中 c 为装填因子(Load Factor)
  • 知识点总结表格:

    查找方法平均查找长度适用条件
    顺序查找法(n + 1) / 2无序或有序表
    二分查找法((n + 1) * log₂(n + 1)) / (n - 1)有序表
    分块查找法(顺序查找块)(s + 2s + n) / (2s)分块且块内有序
    分块查找法(二分查找块)log₂(n/s + 1) + 1/2分块且块内有序,使用二分查找
    哈希表查找法1 + c/2使用哈希函数,装填因子为 c

4. 一个算法的效率可分为 ________

  • 正确答案:

    1. 时间效率
    2. 空间效率
  • 答案解析: 一个算法的效率主要包括时间效率和空间效率。时间效率指算法执行所需的时间,空间效率指算法执行所需的内存空间。

  • 知识点讲解:

    算法效率的两大方面:

    • 时间效率(Time Efficiency):

      • 衡量算法运行所需的时间。
      • 通常用大O符号表示,如 O(n)、O(log n) 等。
      • 影响因素包括算法的基本操作次数和数据规模。
    • 空间效率(Space Efficiency):

      • 衡量算法运行所需的存储空间。
      • 包括输入数据、辅助存储以及算法本身的额外空间。
      • 优化空间效率有助于在资源有限的环境中运行算法。
  • 知识点总结表格:

    效率类型解释
    时间效率算法执行所需的时间,通常用大O符号表示
    空间效率算法执行所需的内存空间,包括输入、辅助存储和额外空间
    影响因素操作次数、数据规模、存储结构等
    优化目标减少时间复杂度和空间复杂度,提升算法性能

5. 设有一稠密图 G,则 G 采用 ____ 存储较省空间。

  • 正确答案:

    • 邻接矩阵
  • 答案解析: 对于稠密图(即边数接近顶点数的平方),使用邻接矩阵存储更为节省空间。邻接矩阵使用二维数组表示顶点之间的连接关系,适合边较多的图。

  • 知识点讲解:

    图的存储方式:

    • 邻接矩阵(Adjacency Matrix):

      • 使用二维数组表示图。
      • matrix[i][j] 表示顶点 i 到顶点 j 是否有边。
      • 空间复杂度为 O(n²),适用于稠密图。
    • 邻接表(Adjacency List):

      • 每个顶点维护一个链表,存储其邻接的顶点。
      • 空间复杂度为 O(n + e),其中 e 为边数。
      • 适用于稀疏图。

    稠密图与稀疏图:

    • 稠密图(Dense Graph): 边数接近顶点数的平方,即 e ≈ n²
    • 稀疏图(Sparse Graph): 边数远小于顶点数的平方,即 e << n²
  • 知识点总结表格:

    存储方式特点适用图类型
    邻接矩阵使用二维数组表示,空间复杂度 O(n²)稠密图
    邻接表每个顶点维护链表,空间复杂度 O(n + e)稀疏图
    十字链表适用于有向图,分别存储入边和出边有向稠密图
    边集数组列出所有边,适用于需要遍历所有边的场景任意类型图

6. 在 n 个结点的单链表中要删除已知结点 p,需找到 ____,其时间复杂度为 ____

  • 正确答案:

    1. p 的直接前驱
    2. O(n)
  • 答案解析: 在单链表中删除结点 p 时,需要先找到 p 的直接前驱结点,以便更新前驱结点的指针指向 p 的下一个结点。这一操作需要遍历链表,时间复杂度为 O(n)。

  • 知识点讲解:

    单链表的删除操作:

    • 步骤:

      1. 找到前驱结点: 遍历链表找到结点 p 的前驱结点。
      2. 更新指针: 将前驱结点的 next 指针指向 pnext 结点。
      3. 释放结点: 释放结点 p 的内存(若使用动态内存管理)。
    • 时间复杂度:

      • 由于需要遍历链表找到前驱结点,时间复杂度为 O(n)。
  • 知识点总结表格:

    知识点解释
    单链表每个结点有一个指向下一个结点的指针
    删除操作步骤找到前驱结点,更新指针,释放目标结点
    时间复杂度删除操作需要遍历链表,时间复杂度为 O(n)
    前驱结点查找需要从头开始遍历,直到找到目标结点的前驱

7. 深度为 k 的完全二叉树至少有 ____ 个结点,至多有 ____ 个结点。若按自上而下从左到右次序给结点编号(从 1 开始),则编号最小的叶子结点的编号是 ____

  • 正确答案:

    1. 至少有 2^k - 1 个结点
    2. 至多有 2^(k+1) - 1 个结点
    3. 最小的叶子结点编号是 2^k
  • 答案解析:

    • 结点数量:
      • 至少: 一个深度为 k 的完全二叉树至少需要满二叉树的结点数,即 2^k - 1
      • 至多: 深度为 k 的完全二叉树至多有 2^(k+1) - 1 个结点。
    • 最小叶子结点编号: 在按层序编号的完全二叉树中,最小的叶子结点编号为 2^k
  • 知识点讲解:

    完全二叉树的性质:

    • 定义: 完全二叉树是除了最后一层外,每一层的结点都达到最大个数,且最后一层的结点都尽可能地集中在左侧。

    • 结点数量:

      • 最少结点数: 对于深度为 k 的完全二叉树,最少结点数为满二叉树的结点数,即 2^k - 1
      • 最多结点数: 对于深度为 k 的完全二叉树,最多结点数为 2^(k+1) - 1
    • 结点编号:

      • 按层序编号(自上而下,从左到右)时,最小的叶子结点编号为 2^k
  • 知识点总结表格:

    知识点解释
    完全二叉树定义除了最后一层外,每层结点数达到最大,最后一层结点尽可能集中在左
    最少结点数2^k - 1,对应满二叉树
    最多结点数2^(k+1) - 1
    叶子结点编号按层序编号时,最小的叶子结点编号为 2^k
    完全二叉树性质高度平衡,适用于堆等数据结构

8. 线性结构中元素之间存在 ____ 关系,树形结构中元素之间存在 ____ 关系,图形结构中元素之间存在 ____ 关系。

  • 正确答案:

    1. 一对一
    2. 一对多
    3. 多对多
  • 答案解析:

    • 线性结构(Linear Structure): 元素之间为一对一关系,如链表中的前后结点关系。
    • 树形结构(Tree Structure): 元素之间为一对多关系,如树的父子结点关系。
    • 图形结构(Graph Structure): 元素之间为多对多关系,如社交网络中的朋友关系。
  • 知识点讲解:

    数据结构中的元素关系:

    • 线性结构:

      • 定义: 元素按顺序排列,每个元素只有一个前驱和一个后继。
      • 关系类型: 一对一。
      • 示例: 数组、链表、栈、队列。
    • 树形结构:

      • 定义: 层次化的结构,每个结点可以有多个子结点,但只有一个父结点。
      • 关系类型: 一对多。
      • 示例: 二叉树、堆、文件系统目录结构。
    • 图形结构:

      • 定义: 任意连接的结构,结点之间可以有多个连接。
      • 关系类型: 多对多。
      • 示例: 社交网络图、交通网络图、通信网络图。
  • 知识点总结表格:

    数据结构元素关系解释示例
    线性结构一对一每个元素有一个前驱和一个后继(除了第一个和最后一个)数组、链表、栈、队列
    树形结构一对多每个结点有一个父结点和多个子结点二叉树、堆、文件系统目录结构
    图形结构多对多任意结点之间可以有多个连接,形成复杂网络社交网络图、交通网络图、通信网络

9. 数据的运算最常用的有五种,它们分别是 ________

  • 正确答案:

    1. 插入
    2. 查找
    3. 删除
    4. 更新
    5. 排序
  • 答案解析: 数据的基本运算包括插入、查找、删除、更新和排序。这些操作是各种数据结构和数据库管理系统的基础,支持数据的增删改查和组织。

  • 知识点讲解:

    基本数据操作:

    • 插入(Insert):

      • 向数据结构中添加新的元素。
      • 示例:在数组中添加元素,在链表中插入结点。
    • 查找(Search):

      • 在数据结构中查找特定元素。
      • 示例:在数组中查找元素,使用哈希表查找键。
    • 删除(Delete):

      • 从数据结构中移除特定元素。
      • 示例:从链表中删除结点,从数据库中删除记录。
    • 更新(Update):

      • 修改数据结构中已有元素的值。
      • 示例:在数组中修改元素值,更新数据库中的记录。
    • 排序(Sort):

      • 将数据结构中的元素按特定顺序排列。
      • 示例:对数组进行升序排序,使用快速排序算法。
  • 知识点总结表格:

    运算类型解释示例
    插入向数据结构中添加新的元素数组中添加元素,链表中插入结点
    查找在数据结构中查找特定元素数组中查找元素,哈希表查找键
    删除从数据结构中移除特定元素链表中删除结点,数据库中删除记录
    更新修改数据结构中已有元素的值数组中修改元素,更新数据库记录
    排序将数据结构中的元素按特定顺序排列数组升序排序,快速排序算法

10. 一棵含有 n 个结点的完全二叉树,它的高度是 ____

  • 正确答案:

    • [log₂n] + 1
  • 答案解析: 完全二叉树的高度(或深度)可以通过公式计算得出。对于含有 n 个结点的完全二叉树,其高度为 floor(log₂n) + 1。这里的 floor(log₂n) 表示 log₂n 的下取整。

  • 知识点讲解:

    完全二叉树的高度计算:

    • 定义: 完全二叉树是一种特殊的二叉树,除了最后一层外,其他每一层的结点都达到最大个数,且所有结点尽可能地集中在左侧。

    • 高度计算公式:

      高度=⌊log⁡2n⌋+1\text{高度} = \lfloor \log_2 n \rfloor + 1高度=⌊log2​n⌋+1

      其中,n 为结点数,log₂ 表示以 2 为底的对数,floor 表示向下取整。

    • 示例:

      • 对于 n = 7,log⁡27≈2.807\log_2 7 \approx 2.807log2​7≈2.807,向下取整为 2,故高度为 2 + 1 = 3
      • 对于 n = 15,log⁡215≈3.907\log_2 15 \approx 3.907log2​15≈3.907,向下取整为 3,故高度为 3 + 1 = 4
  • 知识点总结表格:

    知识点解释
    完全二叉树定义每层结点数达到最大,最后一层结点尽可能集中在左侧
    高度计算公式floor(log₂n) + 1
    高度意义从根到叶子的最长路径上的结点数
    计算步骤计算 log₂n,向下取整,再加 1
    示例n = 7 时,高度为 3;n = 15 时,高度为 4

附加内容:循环队列的存储设计

  • 条件:

    1. 队空标志为:front == rear
    2. 队满标志为:(rear + 1) % m == front
    3. rear > front 时,队列长度为:rear - front
    4. rear < front 时,队列长度为:(rear + m) - front
    5. 进队操作:rear = (rear + 1) % m
    6. 出队操作:front = (front + 1) % m
  • 答案解析: 循环队列通过取模运算实现队列的环状循环。当 rear 指针移动到队列末尾后,通过取模运算可以回到队列的起始位置,实现循环使用存储空间。

  • 知识点讲解:

    循环队列的存储设计:

    • 定义: 循环队列是一种利用数组实现的队列,支持队列头尾的循环使用。

    • 关键指标:

      • 队空条件: front == rear,表示队列为空。
      • 队满条件: (rear + 1) % m == front,表示队列已满,其中 m 为队列的最大容量。
    • 队列长度计算:

      • rear > front 时: 队列长度为 rear - front
      • rear < front 时: 队列长度为 (rear + m) - front
    • 队列操作:

      • 进队(Enqueue): 将元素插入到 rear 指针指向的位置,然后更新 rear。 rear=(rear+1)%mrear = (rear + 1) \% mrear=(rear+1)%m
      • 出队(Dequeue): 移除 front 指针指向的元素,然后更新 front。 front=(front+1)%mfront = (front + 1) \% mfront=(front+1)%m
    • 优点:

      • 高效利用存储空间,避免了普通队列的“假溢出”问题。
    • 注意事项:

      • 必须预留一个空间区分队满和队空状态。
      • 需要合理选择队列的容量 m 以满足应用需求。
  • 知识点总结表格:

    知识点解释
    队空条件front == rear,队列为空
    队满条件(rear + 1) % m == front,队列已满
    队列长度计算rear - front(当 rear > front),(rear + m) - front(当 rear < front
    进队操作rear = (rear + 1) % m
    出队操作front = (front + 1) % m
    优点高效利用存储空间,避免假溢出
    注意事项预留空间区分队满和队空,合理选择队列容量 m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值