第二章作业
一、算法描述
找第 k 小的数,经典分治实现是快速选择算法。它借用快速排序的划分思想,每次只递归包含目标的那一半。
具体过程:
- 从当前数组中随机选取一个元素作为基准值 pivot。
- 遍历数组进行划分。小于 pivot 的元素放左侧,大于 pivot 的放右侧,等于 pivot 的集中在中间。统计小于 pivot 的元素个数 cnt。
- 比较 k 与 cnt:
· k 等于 cnt + 1,pivot 就是第 k 小,返回。
· k 小于等于 cnt,第 k 小在左半部分,递归处理左区间。
· k 大于 cnt + 1,第 k 小在右半部分,递归处理右区间,k 减去 cnt + 1。 - 重复上述过程,直到找到目标。
二、时间复杂度分析
最好情况: 每次划分均匀分成两半,目标落在其中一半,只需递归一边。问题规模减半。递推关系 T(n) = T(n/2) + O(n)。由主定理得 T(n) = O(n)。这是快速选择能达到的最优复杂度。至少扫描一遍数组才能确定第 k 小。
最坏情况: 每次选取的 pivot 都是当前区间的最大或最小元素。划分极不均匀,每次只能排除一个元素。递推关系 T(n) = T(n-1) + O(n)。展开得 T(n) = O(n²)。数组有序、固定取首元素为 pivot 时最容易出现。
平均情况: 每次随机选 pivot,划分期望均衡。递归深度期望 O(log n),每层总代价 O(n)。平均时间复杂度 O(n)。随机化引入是为了规避最坏情况。
三、对分治法的体会与思考
分治法核心是“分而治之”。快速选择让我体会到,分治不一定两边都递归,只递归有解的一半,平均复杂度就能降到线性。
分治效率高度依赖划分是否均衡。快速排序和快速选择最坏都会退化为 O(n²),需要随机化 pivot 避免极端情况。分治法不仅要会“分”,更要设计好的划分策略,否则分治反而会变慢。

浙公网安备 33010602011771号