第二章作业-分治法实践与感悟

想要在无须的数列中找到第k小的数字,我们可以采用分治法的思想帮助我们解决问题。具体而言,第一步分解子问题,创建一个数组记录这个数列,在数组中随机选取一个元素作为分隔的“隔板”(命名为"pivot"吧),把小于pivot的数字都移动到左侧,把大于pivot的数字都移动到右侧,pivot最后所处的位置记录为pos。第二步求解子问题。情况一,pos正好在第k小的位置,无需其他操作,直接返回povit。情况二,pos > k - 1(数组中第k个数字的下表为k - 1),第k小在左侧,递归左半区间。情况三,pos < k - 1,第k小在右侧,左半区间。第三步合并子问题,不过本算法并不需要真正的合并步骤。
接下来是时间复杂度的分析。最好情况下,每次能均匀的划分。分解子问题时间复杂度O(n);递归时只递归一侧,另一侧弃用,所以问题个数1个,a = 1;问题规模n / 2,所以b = 2;T(n) = T(n / 2) + O(n),所以最好时间复杂度为T(n) = O(n)。最坏情况下,“隔板”是数组的最值,T(n) = T(n - 1) + O(n),所以最坏时间复杂度为T(n) = O(n2)。
本章学习之后,我感觉分治法是个非常有韵味的算法思想,化繁为简,分而治之。但是划分是否均衡会很大程度上影响算法的效率,所以可以采用随机化基准值或者三数取中的策略来应对划分不平衡的问题。分治的时候,我常常会用到递归,不过后来我了解到递归不是分治法的唯一工具。此外,分治法也不是“万金油”,问题的分解或者合并很复杂时就不适用这种方法了。

posted @ 2026-10-13 23:48  张颖菲  阅读(3)  评论(0)    收藏  举报