选择问题的算法(详细分析)

选最大与最小

选最大:顺序比较,比较次数 n-1
选最小:顺序比较,比较次数 n-1

选最大和最小:
顺序比较:比较次数 (n-1)+(n-2)=2n-3
分组:比较次数 ⌈3n/2⌉ - 2
分治:n=2^k,比较次数 3n/2-2

只选最大或者最小,顺序比较是最好得方法,比较次数是最少的;
选最大和最小,分组和分治一样好,两个都是最好的算法。

分组算法:


分治算法:

选第二大

问题描述:
输入: n 个数的数组 L
输出:第二大的数 second

通常算法:
顺序比较
1.顺序比较找到最大max
2.从剩下 n-1 个数中找最大,就是第二大second
时间复杂度:W(n)= n-1 +n- 2 = 2n-3

锦标赛算法:
时间复杂度:n +⌈ logn ⌉ -2
主要的技术:用时间换空间

提高效率:

锦标赛算法:

伪码:

实例:

时间复杂度分析:


一般性选择问题

类似于选第二大的问题,一般选择问题是选择第 k 小元素。

问题描述:选第k小
输入:数组 S,S 的长度 n,正整数 k,1≤k≤n
输出:第 k 小的数

算法:
算法一:调用 k 次选最小算法
时间复杂度为 O( kn )

算法二:先排序,然后输出第 k 小的数
时间复杂度为 O( nlogn )

算法三:分治算法
时间复杂度为 O( n )

分治算法:

选择问题的算法分析

3分组时的子问题规模

说明

内容主要是以 北京大学屈婉玲老师的 MOOC 视频记录来写,
如果想理解的更透彻些,可以去刷一遍视频。(第四周的2-5节内容)

猜你喜欢

转载自blog.csdn.net/xiaobai_qian/article/details/106449850
今日推荐