算法第二章实践作业
(1)描述找第k小数的分治算法
首先选择基准,随机选择当前数组的一个元素作为基准。随后将数组进行划分,将所有小于基准的元素放到基准元素的左边,将所有大于基准元素的数放到基准元素的右边。最后进行判断与递归操作,若左部分元素个数大于等于k,说明第 k 小的数在左部分,递归处理左部分;若左部分元素个数 + 中间部分元素个数 ≥ k,说明基准就是第 k 小的数,直接返回;若上述两种情况不满足,说明第 k 小的数在右部分,递归处理右部分。当子数组长度为 1 时,直接返回该元素(此时该元素就是当前子问题的第k小值)。
(2)算法的最好与最坏时间复杂度的分析
最好:当每次划分绝对均衡,基准元素恰好为当前数组的中间值时,此时时间复杂度为O(n)
最坏:当每次划分都极端不均衡,基准始终是当前子数组的 “最大值” 或 “最小值”时,此时时间复杂度为O(n^2)
(3)对分治法的体会和思考
1.必须将原问题拆分为 “规模更小、结构相同” 的子问题。这是分治法的前提 —— 子问题与原问题本质一致,才能递归复用同一逻辑。
2.运用分治法时首先判断终止条件,子问题规模足够小时,需有 “直接求解” 的终止条件。
3.分治法的本质不是 “递归”,而是通过 “简化问题规模” 和 “复用求解逻辑” 提高效率。

浙公网安备 33010602011771号