算法第二章实践作业
- 找第k小的数的分治算法描述
自然语言描述:
采用类似快速排序的划分思想(Quickselect算法)。从数组中选择一个基准元素,将数组划分为两部分:小于等于基准的元素在左,大于基准的元素在右。此时基准元素的下标即为它在排序后数组中的最终位置。若该位置恰好等于k,则找到答案;若位置大于k,在左半部分递归查找第k小;若位置小于k,在右半部分递归查找第 k 减去左半部分元素总数 小的数。
伪代码:
function findKthSmallest(arr, left, right, k):
if left == right: return arr[left]
pivotIndex = partition(arr, left, right)
count = pivotIndex - left + 1
if k == count:
return arr[pivotIndex]
else if k < count:
return findKthSmallest(arr, left, pivotIndex - 1, k)
else:
return findKthSmallest(arr, pivotIndex + 1, right, k - count)
- 最好时间复杂度和最坏时间复杂度
最好时间复杂度:O(n)。
每次划分时,基准元素恰好能将数组均匀分为两半,或者基准元素正好是第k小的数。每次只需递归处理其中一半的数组,时间复杂度递推式为 T(n) = T(n/2) + O(n),总体时间复杂度为 O(n)。
最坏时间复杂度:O(n^2)。
当数组已经有序,且每次选择的基准元素都是当前数组的最大值或最小值时,划分极度不平衡,每次只能排除一个元素,时间复杂度递推式为 T(n) = T(n-1) + O(n),总体时间复杂度为 O(n^2)。
- 对分治法的体会和思考
分治法的核心在于“分而治之”,即将一个难以直接解决的大问题,分解为若干个规模较小的相同问题,分别求解后再合并。在找第k小元素的问题中,分治法体现了极高的效率:与快速排序需要递归处理两边不同,快速选择算法只需要根据基准位置和k的关系,有选择地递归其中一边,从而将平均时间复杂度优化到了 O(n)。
此外,划分策略的选择至关重要。基准元素的选择直接决定了算法效率,为了避免最坏情况,实际应用中常采用随机化选择基准或三数取中等策略来保证期望时间复杂度。分治思想在二分查找、归并排序等领域都有广泛应用,是算法设计中极为重要的基石。
浙公网安备 33010602011771号