第二章作业

  1. 找第k小的数(分治算法描述)
    (1)在当前数组区间里选取一个基准元素  pivot ;
    (2) 划分(partition):将区间内元素重新排列,小于等于pivot的放到pivot左边,大于pivot的放到右边。划分完成后,pivot落在它最终正确的位置pos上;
    (3)判断:
    如果  pos == k :基准元素就是第k小元素,直接返回;
    如果  pos > k :第k小的数落在左半区间,递归在左子区间继续查找第k小;
    如果  pos < k :第k小的数落在右半区间,递归在右子区间查找第  k-pos  小;

  2. 时间复杂度分析
    (1)最好时间复杂度:O(n)
    每次划分都把数组大致对半拆分,每次处理的数组规模按 n \to n/2 \to n/4…,总工作量 n + n/2 + n/4 + ... = O(n)。
    (2)最坏时间复杂度:O(n^2)
    当基准每次选到数组最大/最小值,划分后一边只有1个元素,另一边是剩下全部元素,递归深度变成 n,总时间 O(n^2)。
    补充:随机选取基准可以让算法期望时间复杂度 O(n),大幅降低最坏情况出现概率。

  3. 对分治法的体会与思考
    分治法核心思想:把一个大规模的原问题,拆成若干个结构相同、规模更小的子问题;分别求解子问题,最后合并子问题的解得到原问题答案。
    (1)适用条件:问题可以分解为同类型子问题;子问题独立(子问题之间没有互相依赖);子问题解可以合并得到原问题解。像快速选择、归并排序、快速排序、最近点对都是典型例子。
    (2) 优势:利用递归,将复杂大问题简化,代码逻辑清晰;很多场景下相比暴力枚举,可以显著降低时间复杂度。
    (3)需要注意的地方:分治会带来递归调用的栈开销;如果划分策略很差(如快选最坏情况),复杂度会退化。设计算法时要考虑划分策略,例如随机选基准来规避最坏情况。
    (4)对比:分治的子问题互相独立,和动态规划有明显区别:动态规划子问题大量重叠,会保存子问题结果避免重复计算;分治一般直接递归求解独立子问题。

posted @ 2026-10-13 22:26  Kkyeee  阅读(2)  评论(0)    收藏  举报