目录
1. 在单链表中要在已知结点 p 之前插入一新结点,仍需找到 ____,其时间复杂度为 ____,而在双链表中完成同样操作其时间复杂度为 ____。
2. 在 HQ 的链队中,判定只有一个结点的条件是 ____。
5. 设有一稠密图 G,则 G 采用 ____ 存储较省空间。
6. 在 n 个结点的单链表中要删除已知结点 p,需找到 ____,其时间复杂度为 ____。
7. 深度为 k 的完全二叉树至少有 ____ 个结点,至多有 ____ 个结点。若按自上而下从左到右次序给结点编号(从 1 开始),则编号最小的叶子结点的编号是 ____。
8. 线性结构中元素之间存在 ____ 关系,树形结构中元素之间存在 ____ 关系,图形结构中元素之间存在 ____ 关系。
9. 数据的运算最常用的有五种,它们分别是 ____ 和 ____。
10. 一棵含有 n 个结点的完全二叉树,它的高度是 ____。
1. 在单链表中要在已知结点 p
之前插入一新结点,仍需找到 ____
,其时间复杂度为 ____
,而在双链表中完成同样操作其时间复杂度为 ____
。
-
正确答案:
- p 的直接前驱
- O(n)
- 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
是装填因子。
- 顺序查找法(Linear Search): 平均情况下需要查找
-
知识点讲解:
查找算法的平均查找长度(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. 一个算法的效率可分为 ____
和 ____
。
-
正确答案:
- 时间效率
- 空间效率
-
答案解析: 一个算法的效率主要包括时间效率和空间效率。时间效率指算法执行所需的时间,空间效率指算法执行所需的内存空间。
-
知识点讲解:
算法效率的两大方面:
-
时间效率(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
,需找到 ____
,其时间复杂度为 ____
。
-
正确答案:
- p 的直接前驱
- O(n)
-
答案解析: 在单链表中删除结点
p
时,需要先找到p
的直接前驱结点,以便更新前驱结点的指针指向p
的下一个结点。这一操作需要遍历链表,时间复杂度为 O(n)。 -
知识点讲解:
单链表的删除操作:
-
步骤:
- 找到前驱结点: 遍历链表找到结点
p
的前驱结点。 - 更新指针: 将前驱结点的
next
指针指向p
的next
结点。 - 释放结点: 释放结点
p
的内存(若使用动态内存管理)。
- 找到前驱结点: 遍历链表找到结点
-
时间复杂度:
- 由于需要遍历链表找到前驱结点,时间复杂度为 O(n)。
-
-
知识点总结表格:
知识点 解释 单链表 每个结点有一个指向下一个结点的指针 删除操作步骤 找到前驱结点,更新指针,释放目标结点 时间复杂度 删除操作需要遍历链表,时间复杂度为 O(n) 前驱结点查找 需要从头开始遍历,直到找到目标结点的前驱
7. 深度为 k
的完全二叉树至少有 ____
个结点,至多有 ____
个结点。若按自上而下从左到右次序给结点编号(从 1 开始),则编号最小的叶子结点的编号是 ____
。
-
正确答案:
- 至少有
2^k - 1
个结点 - 至多有
2^(k+1) - 1
个结点 - 最小的叶子结点编号是
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. 线性结构中元素之间存在 ____
关系,树形结构中元素之间存在 ____
关系,图形结构中元素之间存在 ____
关系。
-
正确答案:
- 一对一
- 一对多
- 多对多
-
答案解析:
- 线性结构(Linear Structure): 元素之间为一对一关系,如链表中的前后结点关系。
- 树形结构(Tree Structure): 元素之间为一对多关系,如树的父子结点关系。
- 图形结构(Graph Structure): 元素之间为多对多关系,如社交网络中的朋友关系。
-
知识点讲解:
数据结构中的元素关系:
-
线性结构:
- 定义: 元素按顺序排列,每个元素只有一个前驱和一个后继。
- 关系类型: 一对一。
- 示例: 数组、链表、栈、队列。
-
树形结构:
- 定义: 层次化的结构,每个结点可以有多个子结点,但只有一个父结点。
- 关系类型: 一对多。
- 示例: 二叉树、堆、文件系统目录结构。
-
图形结构:
- 定义: 任意连接的结构,结点之间可以有多个连接。
- 关系类型: 多对多。
- 示例: 社交网络图、交通网络图、通信网络图。
-
-
知识点总结表格:
数据结构 元素关系 解释 示例 线性结构 一对一 每个元素有一个前驱和一个后继(除了第一个和最后一个) 数组、链表、栈、队列 树形结构 一对多 每个结点有一个父结点和多个子结点 二叉树、堆、文件系统目录结构 图形结构 多对多 任意结点之间可以有多个连接,形成复杂网络 社交网络图、交通网络图、通信网络
9. 数据的运算最常用的有五种,它们分别是 ____
和 ____
。
-
正确答案:
- 插入
- 查找
- 删除
- 更新
- 排序
-
答案解析: 数据的基本运算包括插入、查找、删除、更新和排序。这些操作是各种数据结构和数据库管理系统的基础,支持数据的增删改查和组织。
-
知识点讲解:
基本数据操作:
-
插入(Insert):
- 向数据结构中添加新的元素。
- 示例:在数组中添加元素,在链表中插入结点。
-
查找(Search):
- 在数据结构中查找特定元素。
- 示例:在数组中查找元素,使用哈希表查找键。
-
删除(Delete):
- 从数据结构中移除特定元素。
- 示例:从链表中删除结点,从数据库中删除记录。
-
更新(Update):
- 修改数据结构中已有元素的值。
- 示例:在数组中修改元素值,更新数据库中的记录。
-
排序(Sort):
- 将数据结构中的元素按特定顺序排列。
- 示例:对数组进行升序排序,使用快速排序算法。
-
-
知识点总结表格:
运算类型 解释 示例 插入 向数据结构中添加新的元素 数组中添加元素,链表中插入结点 查找 在数据结构中查找特定元素 数组中查找元素,哈希表查找键 删除 从数据结构中移除特定元素 链表中删除结点,数据库中删除记录 更新 修改数据结构中已有元素的值 数组中修改元素,更新数据库记录 排序 将数据结构中的元素按特定顺序排列 数组升序排序,快速排序算法
10. 一棵含有 n
个结点的完全二叉树,它的高度是 ____
。
-
正确答案:
[log₂n] + 1
-
答案解析: 完全二叉树的高度(或深度)可以通过公式计算得出。对于含有
n
个结点的完全二叉树,其高度为floor(log₂n) + 1
。这里的floor(log₂n)
表示log₂n
的下取整。 -
知识点讲解:
完全二叉树的高度计算:
-
定义: 完全二叉树是一种特殊的二叉树,除了最后一层外,其他每一层的结点都达到最大个数,且所有结点尽可能地集中在左侧。
-
高度计算公式:
高度=⌊log2n⌋+1\text{高度} = \lfloor \log_2 n \rfloor + 1高度=⌊log2n⌋+1其中,
n
为结点数,log₂
表示以 2 为底的对数,floor
表示向下取整。 -
示例:
- 对于
n = 7
,log27≈2.807\log_2 7 \approx 2.807log27≈2.807,向下取整为 2,故高度为2 + 1 = 3
。 - 对于
n = 15
,log215≈3.907\log_2 15 \approx 3.907log215≈3.907,向下取整为 3,故高度为3 + 1 = 4
。
- 对于
-
-
知识点总结表格:
知识点 解释 完全二叉树定义 每层结点数达到最大,最后一层结点尽可能集中在左侧 高度计算公式 floor(log₂n) + 1
高度意义 从根到叶子的最长路径上的结点数 计算步骤 计算 log₂n
,向下取整,再加 1示例 n = 7
时,高度为 3;n = 15
时,高度为 4
附加内容:循环队列的存储设计
-
条件:
- 队空标志为:
front == rear
- 队满标志为:
(rear + 1) % m == front
- 当
rear > front
时,队列长度为:rear - front
- 当
rear < front
时,队列长度为:(rear + m) - front
- 进队操作:
rear = (rear + 1) % m
- 出队操作:
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
- 进队(Enqueue): 将元素插入到
-
优点:
- 高效利用存储空间,避免了普通队列的“假溢出”问题。
-
注意事项:
- 必须预留一个空间区分队满和队空状态。
- 需要合理选择队列的容量
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