算法第二章作业
1.找第k小的数的分治算法(自然语言描述)
这个算法通常称为快速选择算法,步骤如下:
选择基准元素:从数组中随机选择一个元素作为基准(pivot)
分区操作:将数组重新排列,使得:所有小于基准的元素放在基准左边;所有大于基准的元素放在基准右边;基准元素位于其最终排序后的正确位置
判断位置:
如果基准的当前位置正好是k-1(因为数组索引从0开始),那么基准就是第k小的数
如果基准位置大于k-1,说明第k小的数在左半部分,递归在左半部分找第k小的数
如果基准位置小于k-1,说明第k小的数在右半部分,递归在右半部分找第(k-基准位置-1)小的数
2. 时间复杂度分析
最好情况时间复杂度:O(n),每次选择的基准都能将数组大致平分
递归式:T(n) = T(n/2) + O(n)
最坏情况时间复杂度:O(n²),每次选择的基准都是当前数组的最小或最大元素
递归式:T(n) = T(n-1) + O(n)
3.思考与体会
学分治法时确实遇到不少头疼的问题。递归边界条件经常搞错,有时候少个±1就全乱了。调试的时候更痛苦,递归层数一多,脑子就跟不上了。最让我崩溃的是这些算法,自己实现时各种bug。比如快速选择,理解起来觉得很简单,但写代码时分区操作的各种下标处理能调试半天。不过熬过这些后,确实能感受到分治的威力——把大问题拆成小问题逐个击破,这种思维方式在解决其他复杂问题时也很有用。就是过程比较“折磨”,但值得。
浙公网安备 33010602011771号