找第k小数的分治算法描述
自然语言描述:
在数组中随机选一个数作为基准,把数组分成三部分:比基准小的、等于基准的、比基准大的,计算每部分有多少个数
判断:
如果k在"小"的部分,就在那部分继续找第k小的数
如果k在"等"的部分,基准就是答案
如果k在"大"的部分,就在那部分找第(k-小部分-等部分)小的数
伪代码:
text
function findKthSmallest(arr, k):
pivot = 随机选择arr中的一个元素
small = [x for x in arr if x < pivot]
equal = [x for x in arr if x == pivot]
large = [x for x in arr if x > pivot]
if k <= len(small):
    return findKthSmallest(small, k)
else if k <= len(small) + len(equal):
    return pivot
else:
    return findKthSmallest(large, k - len(small) - len(equal))
时间复杂度分析
最好情况:O(n)
每次都能扔掉一半数据
如:T(n) = T(n/2) + n → O(n)
最坏情况:O(n²)
每次只能减少一个元素
如:T(n) = T(n-1) + n → O(n²)
对分治法的体会
核心思想:大事化小,小事化了
优点:
1、复杂问题变简单
2、代码容易理解和实现
3、有时能大幅提高效率
难点:
1、要找到合适的分割点
2、递归边界容易出错
3、合并结果需要技巧
感悟:分治法像"团队协作"——把大任务拆成小任务分给不同人,最后汇总结果。这种"分而治之"的思想在编程和生活中都很实用。
                    
                

                
            
        
浙公网安备 33010602011771号