算法第二章实践作业

(1)分治法:找第 k 小的数
自然语言描述:
1.选取一个基准元素pivot,调用划分函数把数组分为两部分:左区间全部≤pivot,右区间全部≥pivot,得到基准所在下标。
2.统计左区间元素数量cnt:
·如果cnt == k,基准就是第 k 小元素,直接返回;
·如果k < cnt,说明第 k 小在左边子数组,递归在左区间查找第 k 小;
·如果k > cnt,说明第 k 小在右边子数组,递归在右区间查找第k-cnt小;
3.递归直到区间只有一个元素,直接返回。
核心思想:不需要对整个数组排序,每次只递归其中一侧子区间,减少计算量。

(2)时间复杂度分析
·最好时间复杂度:O(n)
每次划分,基准都刚好把数组大致对半分开。第一次处理 n 个元素,第二次 n/2,第三次 n/4…… 总和:n+2n​+4n​+⋯≈2n=O(n)
·最坏时间复杂度:O(n^2)
每次选的 pivot 都是当前区间的最大值 / 最小值,划分后一侧只有 1 个元素,另一侧剩下n−1个元素。递归总工作量 n+(n−1)+(n−2)+⋯=O(n^2)。

(3)对分治法的体会和思考
分治法核心思想:分、治、合。把一个规模大的原问题,拆成若干规模更小的同类型子问题;递归求解子问题;最后合并子问题结果得到原问题答案。
1.适用场景:问题可以分解、子问题相互独立、子问题解可以合并。比如快速排序、归并排序、快速选择找第k小。
2.优势:把复杂大问题简化,利用递归,逻辑清晰;很多场景相比暴力枚举大幅降低时间复杂度。例如找第 k 小,如果直接排序是O(nlogn),分治快速选择期望O(n)。
3.局限性:
·不是所有问题适合分治,子问题重叠时(如钢条切割),分治会大量重复计算,此时动态规划更合适;
·分治存在递归调用的栈开销;部分分治算法受 pivot 选择影响,存在最坏情况(如QuickSelect 最坏O(n^2));
4.对比:分治法的子问题一般互不重叠;动态规划子问题大量重叠,会保存子问题结果避免重复计算。

posted @ 2026-10-13 21:34  赐予秋  阅读(5)  评论(0)    收藏  举报