第二章作业

  1. 自然语言描述:
    在数组 A[l..r]中找第 k 小的数:
    若区间只有一个元素,直接返回它。
    选择一个枢轴元素 pivot。
    将区间划分为三部分:小于 pivot、等于 pivot、大于 pivot。
    设小于 pivot 的元素个数为 less,等于 pivot 的个数为 equal。
    若 k≤less,说明第 k 小在“小于 pivot”部分,递归到该部分找第 k 小;
    若 less<k≤less+equal,说明第 k 小就是 pivot,直接返回;
    若 k>less+equal,说明第 k 小在“大于 pivot”部分,递归到该部分找第 k−(less+equal) 小。

  2. 最好时间复杂度
    最好情况下,每次选择的枢轴都接近中位数,或者第一次就正好找到第 k 小。
    若每次目标所在的子问题规模大约减半,则有:
    T(n)=T(n/2)+O(n)
    展开得:
    T(n)=O(n)+O(n/2)+O(n/4)+⋯=O(n)
    所以最好时间复杂度为: O(n)

  3. 最坏时间复杂度
    最坏情况下,每次选择的枢轴都是当前区间的最小值或最大值,并且目标元素在较大的那一侧。
    例如数组已经有序,每次选第一个元素作为枢轴,并且要找最大值,则每次只能排除一个元素:
    T(n)=T(n−1)+O(n)
    展开得:
    T(n)=O(n)+O(n−1)+⋯+O(1)=O(n * n)
    所以最坏时间复杂度为: O (n * n)

  4. 对分治法的体会和思考
    找第 k 小问题很好地体现了分治法的核心思想:分解、解决、合并。不过它与归并排序、快速排序不同,因为划分之后并不需要同时递归处理左右两个子问题,而只需要根据 k 的位置进入其中一个子问题。因此,它更像是一种“减治”策略:每次把问题规模缩小,而不是把两个子问题的结果合并起来。
    我从中体会到几点:
    <1> 划分是分治法的关键。
    如果划分得比较平衡,问题规模快速缩小,复杂度可以降到线性;如果划分极不平衡,算法就退化成线性扫描的嵌套,最坏达到 O(n * n)
    <2> 分治法不一定都要“合并”。
    归并排序需要合并两个有序子数组,而找第 k 小只需递归一侧,合并代价为 0。这说明分治法的形式可以很灵活。

posted @ 2026-10-13 21:38  行了吧  阅读(2)  评论(0)    收藏  举报