算法第二章实践作业
(1)请用自然语言或伪代码描述找第k小的数的分治算法
前置:定义一个无序数组a[1…n],其中1<=k<=n;
- 在当前区间l到r选一个基准元素x;
- 对区间划分:把<x的元素放左边,>x的元素放右边,通过partition()函数实现,实现分治两侧;
- 算出此时x在当前区间中升序的排名为m,确定为该数组的第m小;
- if k == m: 即为答案;
- if k < m: 说明第k小的在x左边,递归在左区间找第k小;
- if k > m: 说明第k小的在x右边,递归在右区间找第k-m小;
- l == r为递归出口
(2)分析该算法的最好时间复杂度和最坏时间复杂度
最好情况:每次选择的基准都接近该数组中位数位置。通过分治可列出表达式T(n)=T(n/2)+O(n);有主定理得T(n)=O(n)
最坏情况:每次基准都是该数组最大或最小值,T(n)=T(n-1)+O(n), T(n)=O(n2)
(3)结合本章的学习,谈谈你对分治法的体会和思考
1.划分的标准、如何分解子问题和如何合并决定算法的效率,就像上面的分治中的快速选择,算法效率取决于选取的基准元素;
2.分治法有三步但不一定要合并,有些问题可以直接就输出答案省略合并的步骤;
3.分治法的本质相当于递归,都有把问题的规模缩小的思想来解决,可以用在规模大不好直接解决但子问题方便解决的问题上。它适用的前提是:子问题与原问题同构、相互独立、规模可缩小、解可合并。
浙公网安备 33010602011771号