算法第二章实践作业
1. 用自然语言或伪代码描述找第 k 小的数的分治算法
算法思想:
采用快速选择算法,先选择一个基准值,将数组划分为左右两部分,再根据基准值的位置判断第 k 小的数在哪一部分,只对目标所在的部分继续递归查找,直到找到结果。
伪代码:
QuickSelect(A, left, right, k)
if left == right
return A[left]
p = Partition(A, left, right)
m = p - left + 1
if k == m
return A[p]
else if k < m
return QuickSelect(A, left, p-1, k)
else
return QuickSelect(A, p+1, right, k-m)
其中,Partition 用于划分数组并返回基准值的最终位置,k 从 1 开始计数。
2. 分析算法的最好和最坏时间复杂度
(1)最好情况:
每次划分都比较均匀,只需要处理规模约为原来一半的子问题。
\[ T(n)=T(n/2)+O(n) \]
因此,最好时间复杂度为 O(n)。
(2)最坏情况:
每次选择的基准值都是最大值或最小值,每次只能减少一个元素。
\[ T(n)=T(n-1)+O(n) \]
因此,最坏时间复杂度为 O(n²)。
该算法的平均时间复杂度为 O(n),通常比先排序再查找更高效。
3. 结合本章学习,谈谈对分治法的体会和思考
通过本章学习,我理解了分治法的核心思想,就是将一个大问题分解成若干个小问题,再逐步解决。例如归并排序、快速排序和查找第 k 小的数,都体现了这种思想。
其中,找第 k 小的数让我认识到,并不是所有问题都需要完整处理,有时只需要解决其中一部分,就能得到结果,从而减少计算量。
同时,分治法的效率也与划分方式有关,不合理的划分可能导致时间复杂度增加。因此,在使用分治法时,不仅要考虑如何分解问题,还要注意算法的效率。
通过学习,我体会到分治法不仅是一种算法,也是分析和解决复杂问题的重要思路。

浙公网安备 33010602011771号