第二次作业
1.找第k小的数的分治算法描述
(1)算法描述:该算法基于快速排序的分区思想,但只递归处理包含第k小元素的那一部分,从而平均情况下达到O(n)时间复杂度。
(2)具体步骤:
①在数组的当前查找范围 [left, right]中,选择一个基准元素(biaobin)。
②对数组进行分区,使得分区后:基准元素位于最终排序后的正确位置mid,左边所有元素 ≤ 基准元素,右边所有元素 ≥ 基准元素。
③计算基准元素的排名:currentRank = mid - left + 1
④比较排名与k:
如果 currentRank == k:基准元素就是第k小的元素,直接返回;
如果 currentRank > k:第k小元素在左半部分,递归在 [left, mid-1]中找第k小的元素;
如果 currentRank < k:第k小元素在右半部分,递归在 [mid+1, right]中找第 k - currentRank小的元素。
2.时间复杂度分析
(1)最好情况时间复杂度:O(n)
发生条件:每次分区都能将数组均匀分成两半
递归方程:T(n) = T(n/2) + O(n)
计算过程:
第一层:工作量 ≈ n
第二层:工作量 ≈ n/2
第三层:工作量 ≈ n/4
总和:n + n/2 + n/4 + ... ≤ 2n
结果:O(n)
(2)最坏情况时间复杂度:O(n²)
发生条件:每次分区都极不均匀(如数组已排序且总是选择最边缘元素作为基准)
递归方程:T(n) = T(n-1) + O(n)
计算过程:
第一层:工作量 ≈ n
第二层:工作量 ≈ n-1
第三层:工作量 ≈ n-2
总和:n + (n-1) + (n-2) + ... + 1 = n(n+1)/2
结果:O(n²)
3.对分治法的体会和思考
(1)分治法————分而治之:将原问题分解为若干个规模较小的子问题,递归解决子问题,然后合并子问题的解得到原问题的解。
分解(Divide):将原问题划分成多个子问题,通过partition将数组划分为三个部分(小于基准、等于基准、大于基准)。
解决(Conquer):递归求解各个子问题,只在包含目标的子数组中递归查找,避免不必要的计算。
合并(Combine):将子问题的解合并成原问题的解,直接返回找到的结果,无需复杂的合并操作。
(2)分治法适用条件:
①问题可以分解为相互独立的子问题
②子问题的解可以合并为原问题的解
③子问题的规模足够小时可以直接求解
(3)学习体会和思考
通过学习分治法,我深刻体会到"大事化小、小事化了"的思想在算法设计中的巧妙应用。这种思想不仅适用于算法设计,也适用于解决生活中的复杂问题——将大问题分解为小问题,逐个击破。

浙公网安备 33010602011771号