选最大与最小
选最大:顺序比较,比较次数 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节内容)