第二章作业
一、自然语言描述(找第k小,分治快速选择)
从数组里任选一个元素作为基准,把数组划分成两部分:左边所有数≤基准,右边所有数≥基准。划分完成后看基准所在位置:
- 若基准下标正好等于k-1(数组从0开始),基准就是第k小元素,直接返回;
- 若基准下标大于k-1,说明第k小在左半区间,递归在左半部分继续找第k小;
- 若基准下标小于k-1,说明第k小在右半区间,递归在右半部分找第(k-基准下标-1)小。
只递归处理其中一侧子数组,不需要两边都递归。
二、时间复杂度分析
最好情况:每次划分都把区间大致对半切分,每次划分耗时(O(n)),总复杂度 (O(n))。
最坏情况:每次选的基准都是当前区间最大或最小值,每次划分只能去掉1个元素,需要n轮划分,复杂度 O(n^2)。
三、分治法体会思考
分治法核心思想是“分、治、合”:把大问题拆成结构相同、规模更小的子问题,解决子问题后合并结果。找第k小是很特别的例子,它不需要像归并排序那样同时处理两边子问题再合并,只需选择性递归一侧,降低了平均开销。
分治不是简单拆分,关键看拆分策略。基准的选择直接决定算法效率:选得均衡,复杂度接近线性;选得极差就退化成平方级。这让我意识到,分治算法除了递归框架,划分策略是性能的关键。
分治适合求解可以独立拆分的问题,把复杂问题化繁为简。但递归会带来栈开销,同时要考虑最坏情况的退化。对比排序后取第k小(O(nlogn)),快速选择平均(O(n)),体现分治可以针对问题特点做优化,不必完整求解全部子问题,只求解需要的部分,这是分治很巧妙的优势。

浙公网安备 33010602011771号