主定理与递归式
出处:2023 年《算法基础》期中考试 · 试卷第 1 页
递归式 的解满足 。
从早到晚,按原卷顺序看完三年 39 道题。答案默认收起,方便先独立思考。
2023 / MIDTERM
出处:2023 年《算法基础》期中考试 · 试卷第 1 页
递归式 的解满足 。
出处:2023 年《算法基础》期中考试 · 试卷第 1 页
堆排序和快速排序都是渐近最优的比较排序算法,它们在最坏情况下都需要做 次比较。
出处:2023 年《算法基础》期中考试 · 试卷第 1 页
选择排序的时间复杂度与输入数据的初始排列有关。
出处:2023 年《算法基础》期中考试 · 试卷第 2 页
在使用 RANDOMIZED-SELECT 算法选择第 大的元素时,算法的期望运行时间是线性的。
出处:2023 年《算法基础》期中考试 · 试卷第 2 页
可以使用基于比较的算法,以 的最坏时间复杂度将二叉堆转换为二叉搜索树。
参考答案依据配套答案整理 · 答案卷第 1 页起
F,错误。 假设存在这样的算法,则可先用 时间将任意数组建堆,再转换为二叉搜索树,最后中序遍历得到排序结果,总时间为 ,与比较排序的 最坏下界矛盾。
出处:2023 年《算法基础》期中考试 · 试卷第 2 页
如果把一棵红黑树除根节点和叶子节点外所有节点的颜色反转后,所得到的仍是合法的红黑树,那么任意一个节点的左右子树节点数相等。
参考答案依据配套答案整理 · 答案卷第 1 页起
T,正确。 原树不能有相邻红节点;反色后的树也不能有相邻红节点,因此非根内部节点之间也不能相邻为黑。内部节点颜色必须逐层交替。结合每条根到 NIL 路径黑节点数相同,可得所有 NIL 叶子深度相同,树为完美二叉树,各节点左右子树节点数相等。
出处:2023 年《算法基础》期中考试 · 试卷第 2 页
对于递归式
给出 的一个渐近紧确界。
注:。
出处:2023 年《算法基础》期中考试 · 试卷第 3 页
补全算法 Randomized-Quicksort( 为数组)的伪代码,并分析 Randomized-Quicksort()运行过程中,在最坏和最好情况下,Randomized-Quicksort 分别被调用了多少次?以 符号形式给出答案。
PARTITION(A, p, r)
x = A[r]
i = ____
for j = p to ____
if ____
i = i + 1
swap(A[i], A[j])
swap(A[i + 1], A[r])
return i + 1
RANDOMIZED-PARTITION(A, p, r)
i = RANDOM(p, r)
swap(A[r], A[i])
return PARTITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, r)
if ____
q = RANDOMIZED-PARTITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, ____)
RANDOMIZED-QUICKSORT(A, ____, r)
参考答案依据配套答案整理 · 答案卷第 2 页起
依次填入:、、、、、。
RANDOMIZED-QUICKSORT(A, p, r)
if p < r
q = RANDOMIZED-PARTITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, q - 1)
RANDOMIZED-QUICKSORT(A, q + 1, r)
最坏和最好情况下,函数调用总次数均为 。每个非平凡子问题确定一个枢轴,两次递归调用形成一棵总节点数线性的递归树。调用次数不要与总比较次数或递归深度混淆。
出处:2023 年《算法基础》期中考试 · 试卷第 3 页
给定 个已经排好序的元素 ,请给出时间复杂度为 的算法来判断是否存在元素对满足 ,。给出伪代码,并说明算法的工作原理。
参考答案依据配套答案整理 · 答案卷第 2 页起
采用左右双指针向内搜索。以下按非递减顺序给出伪代码,修正了原答案中的循环边界与变量笔误。
OPPOSITE-PAIR(a, n)
l = 0
r = n - 1
while l < r
s = a[l] + a[r]
if s == 0
return True
if s > 0
r = r - 1
else
l = l + 1
return False
若和大于 ,则当前右端值不可能与剩余任何值组成零和,应缩小右端;若和小于 ,同理增大左端。条件 保证下标不同。两个指针各最多移动 次,时间为 ,辅助空间为 。
出处:2023 年《算法基础》期中考试 · 试卷第 4 页
对于下图所给的斐波那契堆,黑色节点表示结点的 mark 属性为 true:

参考答案依据配套答案整理 · 答案卷第 4 页起
第 1 问:抽取最小结点。 将最小结点的孩子加入根链表,删除最小结点,再反复合并度数相同的根。合并时较小关键字成为父节点,最后更新最小指针。

第 2 问:降低关键字。 将 改为 。若它小于父节点,则切断并加入根链表;对原父节点执行级联切断:未标记的非根结点先置标记,已标记的非根结点继续切断。移到根链表的结点清除标记,再更新最小指针。

上图保留配套答案中的结构示意。根链表顺序及同度根的合并顺序可以不同,应核对堆序、父子关系、度数、标记和最小指针。
出处:2023 年《算法基础》期中考试 · 试卷第 5 页
(a) 说明如何以 的最坏时间复杂度对 范围内的 个整数排序。假设整数已经在你需要的基上,即不需要进行进制转换。
(b) 对于常数 ,给定长度为 ()的数列 ,其每个元素由 生成,其中
离散均匀取值, 在 上连续均匀取值,所有 均独立。
请设计一个桶排序算法,以 的期望时间复杂度对 排序。只需简述算法流程,不需要证明时间复杂度。
提示:应设计 个桶,尽可能均匀地分配元素。
参考答案依据配套答案整理 · 答案卷第 7 页起
(a) 以 为基做稳定基数排序。关键字最大为 ,因此至多 位,每一位用计数排序,代价为 。总时间为 。
(b) 由于 ,可还原
建立 个大桶,每个大桶再分 个小桶。将 放入编号为 的桶,其中
桶 对应半开区间 ;小桶边界用半开区间实现以覆盖所有值。总桶数 ,因为 是常数。每桶内部用插入排序,最后按大桶、小桶顺序串联。各桶等概率,故期望总时间为 。
出处:2023 年《算法基础》期中考试 · 试卷第 6 页
二叉搜索树在最坏情况下仍需 时间完成一次搜索,因此需要引入平衡二叉搜索树。AVL 树要求每个结点左右子树的高度差不超过 。
维护 height[x] 表示结点高度,平衡因子 BF[x] 为左子树高度减右子树高度;取 时,分别表示等高、左高、右高。
(a) 已知某结点 满足 ,,求 的可能值。
(b) 证明:有 个结点的 AVL 树高度为 。
(c) 插入结点后,某些结点的平衡因子可能为 或 。补全 AVL-Balance:输入以 为根且左右子树都高度平衡的子树,将其恢复平衡并返回调整后的根;无需调整则返回 。
AVL-BALANCE(x)
if |BF[x]| <= 1
return x
else if ____
y = ____
if ____
LEFT-ROTATE(y)
return ____
else
____
if ____
____
return ____
参考答案依据配套答案整理 · 答案卷第 8 页起
(a) 可能为 。仅知道两个孩子自身的平衡因子,不能确定两个孩子的绝对高度。
(b) 令 为高度 的 AVL 树的最少结点数,取空树高度为 。有
该递推按斐波那契速度增长,即 ,。因此 蕴含 。
(c)
AVL-BALANCE(x)
if |BF[x]| <= 1
return x
else if BF[x] == 2
y = left[x]
if height[left[y]] < height[right[y]]
LEFT-ROTATE(y)
return RIGHT-ROTATE(x)
else
y = right[x]
if height[left[y]] > height[right[y]]
RIGHT-ROTATE(y)
return LEFT-ROTATE(x)
旋转操作应同步维护父子指针和受影响结点的高度。
出处:2023 年《算法基础》期中考试 · 试卷第 7 页
小花不刷题时能够考 分。《算法导论》共有 道题,刷第 题能使分数提升 ()。若一共刷了 道题,则因疲劳损失 分()。
她只会从某一题开始,按顺序刷连续的若干题,不跳题、不倒序、不重复。若希望最终分数落入 ,有多少种刷题方案?
设计一个最坏时间复杂度为 的算法。分数不一定是 的整数,因此不能使用计数排序等限制数据范围的方法。
参考答案依据配套答案整理 · 答案卷第 9 页起
定义前缀量 ,以及
刷题范围为 时,最终得分为 。于是问题转为统计
的数对数目。
可用归并排序计数:按原下标将前缀数组分为左右两半,递归统计内部合法对;合并前对已排序的两半,用两个单调指针统计每个左半值在右半中满足差值区间的数量;再完成归并。每层 ,共 层,总时间 ,辅助空间 。
这里按原解统计非空连续段。若把“不刷任何题”也算一种方案,当 时再加 。
2024 / MIDTERM
出处:2024 年《算法基础》期中考试 · 试卷第 1 页
递归式 的解满足 。
出处:2024 年《算法基础》期中考试 · 试卷第 1 页
堆排序是一种不稳定的排序算法,给长度为 的数组 建立最大堆的时间复杂度为 。
参考答案依据配套答案整理 · 答案卷第 1 页起
F,错误。 堆排序通常不稳定,但自底向上的 BUILD-MAX-HEAP 时间复杂度为 。不能把逐次插入建堆的上界当作该算法的复杂度。
出处:2024 年《算法基础》期中考试 · 试卷第 1 页
插入排序在最后一趟开始之前,所有的元素可能都不在其最终的位置上。
出处:2024 年《算法基础》期中考试 · 试卷第 2 页
在处理链表而不是数组的数据结构时,快速排序比归并排序更具有优势,因为它不需要额外的空间来进行合并。
出处:2024 年《算法基础》期中考试 · 试卷第 2 页
某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。
参考答案依据配套答案整理 · 答案卷第 1 页起
T,正确。 在结点标识互异的通常约定下,后序为“左、右、根”,中序为“左、根、右”。若右子树非空,根的位置就不可能相同;对子树递归应用同样结论。
出处:2024 年《算法基础》期中考试 · 试卷第 2 页
对于红黑树中的每一个结点 , 的左子树和右子树的高度最多相差 。
出处:2024 年《算法基础》期中考试 · 试卷第 2 页
对于递归式
请给出一个好的渐近上界,并用代入法验证。
参考答案依据配套答案整理 · 答案卷第 2 页起
配套答案给出上界 。令 ,,,猜测 。由归纳假设,
选择 ,则对充分大的 ,后两项之和非正。放大常数并处理有限个基例,得 。
本题在答案卷中位于“简答题第 3 题”,已按题目内容配对。
出处:2024 年《算法基础》期中考试 · 试卷第 3 页
有 个木块,大小为 ;另有 个大小为 的容器。一个容器“被填满”当且仅当其中放入两个木块 ,且 。每个木块只能使用一次。
请给出 时间的算法,判断是否存在分配方案,使得这 个容器都被填满。给出伪代码,说明原理;只输出是或否,不需要输出方案。
参考答案依据配套答案整理 · 答案卷第 2 页起
按原答案的排序与配对思路,可写成更简洁的双指针实现:
CAN-FILL(a, n, m, V)
sort a in nondecreasing order
l = 1
r = n
pairs = 0
while l < r
if a[l] + a[r] <= V
pairs = pairs + 1
l = l + 1
r = r - 1
else
r = r - 1
return pairs >= m
若最小与最大木块之和大于 ,最大木块与任何剩余木块都不兼容,可舍弃。否则将它们配成一对不会降低最优配对数:在任意最优解中,通过交换伙伴可使这两个木块配对,而其余被替换的较小木块仍然兼容。
排序为 ,扫描为 ,总时间 。对应答案卷“简答题第 1 题”。
出处:2024 年《算法基础》期中考试 · 试卷第 3 页
扩张红黑树,使其能以 时间给出动态数集 中两个最接近的数之间的差值 MIN-GAP。
例如 时,返回 。写出数据结构,并说明 MIN-GAP 如何计算。
参考答案依据配套答案整理 · 答案卷第 2 页起
以集合元素为红黑树关键字。在每个结点 维护:子树最小值 、最大值 、最小相邻差 。
设左右孩子分别为 ,则 为以下有效候选的最小值:
空子树及不足两个元素的子树,其最小差取 。最小值、最大值也可由左右子树在 时间合并得到。
插入、删除和旋转后维护这些属性,更新仍为 。根结点的 gap 就是全局最小差,查询为 。对应答案卷“简答题第 2 题”。
出处:2024 年《算法基础》期中考试 · 试卷第 4 页
对于下图所给的斐波那契堆,黑色节点表示结点的 mark 属性为 true:

参考答案依据配套答案整理 · 答案卷第 3 页起
第 1 问:抽取最小结点。 将最小结点的孩子加入根链表,删除最小结点,再反复合并度数相同的根。合并时较小关键字成为父节点,最后更新最小指针。

第 2 问:降低关键字。 将 改为 。若它小于父节点,则切断并加入根链表;对原父节点执行级联切断:未标记的非根结点先置标记,已标记的非根结点继续切断。移到根链表的结点清除标记,再更新最小指针。

上图保留配套答案中的结构示意。根链表顺序及同度根的合并顺序可以不同,应核对堆序、父子关系、度数、标记和最小指针。
出处:2024 年《算法基础》期中考试 · 试卷第 5 页
快速排序
(a) 不对整个数组排序,而只确定一个含 个元素的数列的第 小元素。修改快速排序,避免完整排序的额外操作。根据下面的 QUICKSORT 和 PARTITION,填写 QuickSelect。
QUICKSORT(arr, low, high)
if low < high
pivotIndex = PARTITION(arr, low, high)
QUICKSORT(arr, low, pivotIndex - 1)
QUICKSORT(arr, pivotIndex + 1, high)
PARTITION(arr, low, high)
pivot = arr[high]
i = low - 1
for j = low to high - 1
if arr[j] <= pivot
i = i + 1
SWAP(arr[i], arr[j])
SWAP(arr[i + 1], arr[high])
return i + 1
QuickSelect(arr, low, high, m)
// 在此补全算法
(b) 给出 QuickSelect 平均键码比较次数 的递推表达式。
(c) 当 时,计算 。
参考答案依据配套答案整理 · 答案卷第 6 页起
(a) 只递归处理含目标秩的那一侧。
QUICKSELECT(arr, low, high, m)
if low == high
return arr[low]
pivotIndex = PARTITION(arr, low, high)
k = pivotIndex - low + 1
if m == k
return arr[pivotIndex]
else if m < k
return QUICKSELECT(arr, low, pivotIndex - 1, m)
else
return QUICKSELECT(arr, pivotIndex + 1, high, m - k)
(b) 假设枢轴的秩等概率分布。按题给 PARTITION,每次划分做 次关键字比较,因此 ,且
(c) 令 ,则
将 与 相减,得到 。从 累加可得
其中 。
原答案差异: 原答案写了划分代价 ,并给出 ;该结果与它自己的递推在小规模基例处也不一致。这里明确采用题给伪代码的“关键字比较次数”口径,原文仍可在原卷中核对。
出处:2024 年《算法基础》期中考试 · 试卷第 6 页
二叉搜索树在最坏情况下仍需 时间搜索。Treap 是二叉搜索树(tree)与最小堆(heap)的组合:每个结点 有互异的关键字 和互异的优先级 ,满足:
(a) 给定结点集合 ,有多少棵不同的 Treap 能表示这个集合?
(b) 给出 Treap-Insert 的伪代码,可调用 Left-Rotate 和 Right-Rotate。
(c) 假设优先级独立且均匀分布,求 结点 Treap 中叶子结点数的期望 。
参考答案依据配套答案整理 · 答案卷第 8 页起
(a) 恰有 棵。优先级最小的结点必须为根;关键字将其余结点唯一地分到左右子树,再递归应用相同结论。
(b)
TREAP-INSERT(T, x)
if T == NIL
return x // x 的左右孩子初始化为 NIL
if x.key < T.key
T.left = TREAP-INSERT(T.left, x)
if T.left.priority < T.priority
T = RIGHT-ROTATE(T)
else
T.right = TREAP-INSERT(T.right, x)
if T.right.priority < T.priority
T = LEFT-ROTATE(T)
return T
(c) 根的关键字秩均匀分布。对 ,有
基例 、。代入并归纳可得
出处:2024 年《算法基础》期中考试 · 试卷第 7 页
小迪提出股票“价值区间”分析法。给定价格序列 (),区间大小 和价值差 ;若存在 ,使得
则称存在“价值区间”。
例如 ,当 时有 和 ;当 时不存在。
请设计时间复杂度为 的 ValueRange 算法判断是否存在价值区间。给出伪代码并分析复杂度。输入为 ,输出 True 或 False。
参考答案依据配套答案整理 · 答案卷第 9 页起
采用滑动窗口和哈希桶。若价格和 是整数,取桶宽 ,则同桶的两个值一定满足差值要求;还需检查相邻桶。以下把原答案中的窗口变量 k 统一为 W。
VALUE-RANGE(a, W, A)
if W < 1 or A < 0
return False
buckets = empty hash map
width = A + 1
for i = 0 to length(a) - 1
id = floor(a[i] / width)
if id in buckets
return True
if id - 1 in buckets
if abs(a[i] - buckets[id - 1]) <= A
return True
if id + 1 in buckets
if abs(a[i] - buckets[id + 1]) <= A
return True
buckets[id] = a[i]
if i >= W
erase buckets[floor(a[i - W] / width)]
return False
处理当前值前,桶中包含前面距离不超过 的值。若尚未找到合法对,一个桶至多保存一个候选值,因此移除过期值不会覆盖仍需保留的同桶值。
实数价格的条件: 题干未规定整数。若 为实数,可把桶宽改为 ,同桶差严格小于 ,相邻桶仍逐个检查;若 ,改用窗口内精确值的哈希判重。
假设哈希操作期望为 ,总期望时间 ,空间 。一般哈希表不保证最坏线性时间。
2025 / MIDTERM
出处:2025 年《算法基础》期中考试 · 试卷第 1 页
递归式 的解满足 。
出处:2025 年《算法基础》期中考试 · 试卷第 1 页
记 表示数字 的因子个数,例如 ,因为 都是 的因子。那么 是 的。
出处:2025 年《算法基础》期中考试 · 试卷第 1 页
归并排序是稳定的,其时间复杂度在任何情况下都一定是 。
出处:2025 年《算法基础》期中考试 · 试卷第 2 页
计数排序(Counting Sort)的空间复杂度是 。
出处:2025 年《算法基础》期中考试 · 试卷第 2 页
某二叉树的前序、中序、后序遍历中,任意给定两项,都可以唯一确定第三项。
出处:2025 年《算法基础》期中考试 · 试卷第 2 页
对于一棵黑高为 的红黑树,其内部节点(也就是有键值的点)的数量至多是 。
出处:2025 年《算法基础》期中考试 · 试卷第 2 页
对于递归式
请给出渐近确界。
参考答案依据配套答案整理 · 答案卷第 2 页起
这里 表示以 为底的对数。令 ,并令常数规模的递归终止代价为 。
递归树第 层的总非递归代价为 ,所以
其中 。一般 的上下界可用相邻的 的幂夹逼。课程给出的主定理版本不能直接覆盖 这一情形。
出处:2025 年《算法基础》期中考试 · 试卷第 3 页
有一排共 桶染料,每桶颜色用 之间的一个数字表示。画家小 S 想至少使用 种颜色,但只能使用连续的若干桶染料。
求满足至少 种颜色要求时,最少需要使用多少桶。给出伪代码并说明原理,时间复杂度要求为 。不需要考虑无解情况。
参考答案依据配套答案整理 · 答案卷第 2 页起
用双指针维护窗口 ,用 counts 记录每种颜色的出现次数,total 记录不同颜色数。右端点扩展到满足要求后,反复收缩左端并更新最小长度。
SHORTEST-K-COLORS(colors, k)
n = length(colors)
counts[1..n] = 0
left = 1
total = 0
answer = n
for right = 1 to n
c = colors[right]
if counts[c] == 0
total = total + 1
counts[c] = counts[c] + 1
while total >= k
answer = min(answer, right - left + 1)
c = colors[left]
counts[c] = counts[c] - 1
if counts[c] == 0
total = total - 1
left = left + 1
return answer
每个元素最多进入和离开窗口各一次,时间复杂度为 ,计数数组空间为 。该写法与原解的“先扩右端,再移左端”窗口思路等价,采用通常的 约定。
出处:2025 年《算法基础》期中考试 · 试卷第 3 页
在一个区间集合中,被最多数量区间覆盖的点称为最大重叠点,且它一定可以是某个区间的端点。
简述一种数据结构,使其支持对动态区间集合查询最大重叠点(返回任意符合要求的端点即可),并分析各操作的时间复杂度。
提示:可将左端点关联 值,右端点关联 值。
参考答案依据配套答案整理 · 答案卷第 3 页起
以端点为关键字建立扩张红黑树。左端点权重为 ,右端点权重为 ;扫描前缀权重和就是覆盖数。
每个结点维护子树权重和 sum、最大非空前缀和 max_prefix 及其位置 argmax。设左右孩子为 ,当前权重为 ,则
最大前缀和取以下有效候选的最大值:
同时保存最大值对应的端点。空子树的 sum 设为 ,其非空前缀候选忽略。
插入或删除一个区间,需插入或删除两个端点,沿路径及旋转时每结点用 时间重算属性,总时间 ;查询根的 argmax,时间 。
若为闭区间且坐标相同,必须先处理左端点再处理右端点;同类端点再用唯一编号区分,以正确处理重复端点。
出处:2025 年《算法基础》期中考试 · 试卷第 4 页
对于下图所给的斐波那契堆,黑色节点表示结点的 mark 属性为 true:

参考答案依据配套答案整理 · 答案卷第 4 页起
第 1 问:抽取最小结点。 将最小结点的孩子加入根链表,删除最小结点,再反复合并度数相同的根。合并时较小关键字成为父节点,最后更新最小指针。

第 2 问:降低关键字。 将 改为 。若它小于父节点,则切断并加入根链表;对原父节点执行级联切断:未标记的非根结点先置标记,已标记的非根结点继续切断。移到根链表的结点清除标记,再更新最小指针。

上图保留配套答案中的结构示意。根链表顺序及同度根的合并顺序可以不同,应核对堆序、父子关系、度数、标记和最小指针。
出处:2025 年《算法基础》期中考试 · 试卷第 5 页
线性排序算法
(a) 基数排序(Radix Sort)的正确性依赖稳定的子排序算法。使用计数排序(Counting Sort)作为稳定子排序算法,写出 COUNTING-SORT 的伪代码,对数组 中的 个元素排序,每个元素均为不大于 的非负整数。
原题文字处写作 COUNTING-SORT,其后算法标题及关键字范围使用 ;这里按算法标题统一参数。
(b) 待排序的 个元素各有 位数字,每一位可取 至 中任一值,推导 RADIX-SORT 总时间复杂度。
(c) 对 位二进制数,不按单比特排序,而将其分成 组,每组至多 位(),逐组用计数排序。总时间复杂度 是多少?
参考答案依据配套答案整理 · 答案卷第 5 页起
(a)
COUNTING-SORT(A, m)
n = length(A)
let B[1..n] be a new array
let C[0..m] be a new array
for i = 0 to m
C[i] = 0
for j = 1 to n
C[A[j]] = C[A[j]] + 1
for i = 1 to m
C[i] = C[i] + C[i - 1]
for j = n downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
return B
逆序遍历输入数组写入输出,保证相同关键字的相对次序不变,因此稳定。
(b) 每一位的计数排序为 ,共 位,故
(c) 每组最多 位,关键字范围大小为 ,组数为 ,所以
出处:2025 年《算法基础》期中考试 · 试卷第 6 页
标准二叉搜索树可支持 Search、Insert 和 Delete,但无法高效回答“第 小的关键字是什么”或“关键字 的排名是多少”。
顺序统计树(Order-Statistic Tree,OST)在每个结点 中维护 ,表示以 为根的子树结点总数,包含 自身。NIL 的 size 为 。OS-Select 返回该子树中第 小的结点。
(a) 某结点满足 ,:
(b) 写出 OS-Select 的伪代码。若 ,返回对应结点,否则返回 NIL。
(c) 关键字 按均匀随机排列依次插入,构造 OST。令 为第 小关键字结点的深度,根深度为 。
提示:,且 。 2. 利用上式,推导 OS-Select 的时间复杂度。
参考答案依据配套答案整理 · 答案卷第 6 页起
(a) 。 的子树内排名为左子树大小加 ,即 ,故 OS-Select 返回 自身。
(b)
OS-SELECT(x, i)
if x == NIL
return NIL
if i < 1 or i > x.size
return NIL
r = x.left.size + 1 // NIL.size = 0
if i == r
return x
else if i < r
return OS-SELECT(x.left, i)
else
return OS-SELECT(x.right, i - r)
(c.1) 对 ,结点 是 的祖先,当且仅当在关键字区间 内, 最早插入。因此
利用期望的线性性,
(c.2) 查找访问 个结点,故
()。这是随机构建假设下的期望复杂度,单棵退化树的最坏情况仍为 。
出处:2025 年《算法基础》期中考试 · 试卷第 7 页
有 块按顺序排成一排的“记忆碎片”,第 块记录时间为 , 是 的一个排列。你希望通过交换恢复顺序:
“回忆能力值”为 。一次操作可选两块碎片,其时间为 ;当且仅当 时,可以交换它们当前所在的位置。
可做任意多次合法交换,求恢复严格递增顺序所需的最小精力。设计时间复杂度尽可能小的算法。输入为 ,输出最小代价。
参考答案依据配套答案整理 · 答案卷第 7 页起
小规模:。 最多 个排列状态。以每种允许的交换作为代价 或 的边,在状态图上做 0–1 BFS,求到有序排列的最短距离。
当 时分情况:
1. 。 仅能交换相邻的数值,最少代价等于原排列的逆序对数:
可将操作视为在逆排列中交换相邻位置,而排列及其逆排列的逆序数相同。用归并排序统计,时间 。
2. 。 差为 的免费交换连通所有奇数,也连通所有偶数,因此可在每一类内部免费任意重排。设
每次付费交换最多修正两个奇偶错位;通过类内免费重排可让一对相邻数值处于需要交换的位置,因此该下界可达:
时间为 。
3. 。 免费交换允许数值差为 或 。当 时,这些边连通全部数值( 已连通,其余可用差 连入),连通图边交换可生成任意排列,因此答案为 。
边界: 若允许 ,没有合法交换;已排序时为 ,否则无法完成。原解默认 。