描述找第k小的数的分治算法并且分析复杂度和对分治法的体会和思考
把在 n 个数里找第 k 小”转化为“在一个更小的子集里找第 k' 小:
1.分解:从数组中任选一个元素作为pivot,把数组划分成三部分:小于 pivot 的 L、等于 pivot 的 M、大于 pivot 的 R。
2.解决:看 k 落在哪一段——
若 k ≤ |L|,第 k 小就在 L 中,递归在 L 里找第 k 小;
若 |L| < k ≤ |L|+|M|,pivot 就是答案,直接返回;
否则在 R 中找第 k − |L| − |M| 小。
3.合并:不需要合并,找到等于pivot的数即为答案。
时间复杂度:1.最好情况:Θ(n):第一次选取的pivot即为第k小的数字。
2.最坏情况:Θ(n²):每次选区的pivot都为极值,这样递归的时候下一个数组仍然有n-1个数。
对分治法的体会和思考:1.分治法在于如何去分:同样的问题时间复杂度会有很大的区别,因此要用最合理的方式去分解问题。
2.分治法最后不一定要合并,可能答案就在子问题求解完后得出。
3.分治法的套路:分解子问题,解决子问题,合并子问题。

浙公网安备 33010602011771号