算法第二章实践作业
1.用自然语言描述找第k小的数的分治算法:问题:给定一个数组 A 和一个整数 k(1 ≤ k ≤ n),找出数组中第 k 小的元素。步骤:(1)选择主元:从数组 A 中随机或确定性地选取一个元素作为 pivot。(2)分区:将数组重新排列,使得所有小于 pivot 的元素都在其左边,所有大于 pivot 的元素都在其右边,等于 pivot 的元素可以放在任意一边(通常统一放在某一边或中间)。此步骤结束后,pivot 的最终位置是 p。(3)判断递归方向:如果 k==p,那么 pivot 就是第 k 小的元素,直接返回。如果 k < p,说明第 k 小的元素在 pivot 的左边,只在左子数组递归。如果 k > p,说明第 k 小的元素在 pivot 的右边,只在右子数组递归,注意在右子数组中找的是第 k - p 小的元素(因为已经排除了左边的 p 个元素)。
2.最好时间复杂度和最坏时间复杂度:最好情况下时间复杂度为 O(n),最坏情况下时间复杂度为 O(n²)。
3.对分治法的体会和思考:核心思想:
分:将一个大问题分解成若干个规模较小、结构相似的子问题。
治:递归地解决这些子问题。如果子问题足够小,则直接求解。
合:将子问题的解合并,形成原问题的解。
但在“快速选择”算法中,“合”的阶段非常简单,甚至不需要合并,因为答案就在其中一个子问题中。
有时候,分治法并不是最优解,但它提供了清晰的思路和良好的并行化潜力。

浙公网安备 33010602011771号