算法第二章实践作业

1.分治法找第k小的数
自然语言描述:
在当前数组区间中选一个枢轴元素 pivot。
将区间划分为三部分:
L:所有小于 pivot 的元素;
E:所有等于 pivot 的元素;
R:所有大于 pivot 的元素。
设 |L| 表示 L 中元素个数,|E| 表示 E 中元素个数。
判断第 k 小在哪里:
若 k <= |L|,说明第 k 小在 L 中,递归在 L 中找第 k 小;
若 k <= |L| + |E|,说明第 k 小就是 pivot,直接返回;
否则,第 k 小在 R 中,递归在 R 中找第 k - |L| - |E| 小。
递归直到找到答案。
2. 时间复杂度分析
该算法的效率主要取决于每次划分是否平衡,也就是枢轴选得好不好。
最好时间复杂度:O(n)
最好情况下,每次选择的枢轴都接近中位数,划分后第 k 小所在的一侧规模最多约为原来的一半。于是有:
T(n) = T(n/2) + O(n)
最坏时间复杂度:O(n^2)
最坏情况下,每次划分都极不平衡,例如枢轴总是当前区间的最小值或最大值,并且第 k 小落在剩下的那一大部分中。此时每次只能排除一个元素:
T(n) = T(n-1) + O(n)
3. 对分治法的体会和思考
找第 k 小数的算法很好地体现了分治法的核心思想:分解、求解、合并。不过它和归并排序不同,归并排序需要递归处理左右两个子问题再合并,而快速选择每次只递归处理一个子问题,因此它更接近“减治”思想,即每次把问题规模缩小到原来的一部分。
这个算法给我的体会主要有几点:
(1)划分质量决定算法效率。
如果枢轴选得好,问题规模快速缩小,时间复杂度是线性的;如果枢轴选得差,问题规模每次只减少一点,就会退化成平方级。这说明分治法中“如何分解问题”非常关键。
(2)不需要解决所有子问题。
找第 k 小数不需要把整个数组排序,只需要进入包含第 k 小的那一侧。这体现了算法设计中的“剪枝”和“只解决必要问题”的思想。
(3)随机化可以改善实际性能。
随机选择枢轴可以避免在常见输入下频繁出现最坏情况,使期望时间复杂度达到 O(n)。这提醒我们,分治算法中平衡性很重要,而随机化常常是获得平衡划分的有效手段。
(4)分治法不一定都要合并。
传统分治法常强调“分而治之,再合并”,但快速选择几乎不需要合并步骤。它的重点在于划分和递归缩小范围。这说明分治法是一种思想,而不是固定模板。
总的来说,找第 k 小数的分治算法是一个典型的利用划分来缩小问题规模的算法。它简单、高效,但性能高度依赖枢轴选择。实际应用中常用随机化快速选择;如果需要严格最坏保证,则可以使用中位数的中位数算法。

posted @ 2026-10-13 22:03  Ppai羊  阅读(3)  评论(0)    收藏  举报