问题 :在n个元素中选出第k大的元素(无序)。
基于线性表
基于线性表的遍历操作,我们可以在Θ( n )时间内,完成寻找当前最小元素的任务,因此我们只需要每次找到最小值后,不断缩小查找范围,直到第k次遍历找到的最小值便是我们这个问题的答案。随着k值的不同,这一代价为O(knkn).(注意我们寻找第k大的元素,也可以转化为寻找n-k小元素) 。
基于快排的划分操作
在输入为n的元素中,第k大元素p意味着 ① k - 1 元素比p小 ② n - k 个·元素比p大。而快速排序基于基准元素的划分过程与这有着异曲同工之妙,我们用分治策略来解决这一问题。我们将所有元素划分为大于基准元素的一部分(左边)和大于基准元素的一部分(右边)。唯一不同的时,我们只需要对其中一部分进行递归操作就行了。
① 左边元素个数为 k - 1 ,返回。
② 左边元素个数m大于k,递归在左边查找第k大元素
③ 左边元素个数m小于k,递归在右边查找第k - m - 1 大的元素。同样这一算法性能受划分是否均匀的影响。最坏情况下,与快速排序最坏情况相同,需要O(n2n2)的时间。
平均情况:算法平均情况时间复杂度分析将计算A(n) = EE[T(n)][T(n)] 的一个上界。记小于或等于基准元素的个数为k,则大于基准元素的元素个数为 n - k .定义指标随机变量XkXk = II{大于或等于基准元素的个数为k}。假定所有可能元素等概率出现,则任意元素被选取当基准元素概率相等,即E[Xk]E[Xk] = 1n1n.
T(n)T(n) ≤ ∑n11Xk∑1n1Xk *(T(max(k−1,n−k))T(max(k−1,n−k)) + O( n ) )
=∑n11Xk∑1n1Xk *T(max(k−1,n−k))T(max(k−1,n−k)) + O( n ) ,
E[T(n)]E[T(n)] ≤≤ EE[∑n11Xk[∑1n1Xk * T(max(k−1,n−k))T(max(k−1,n−k)) + O( n ) ]
= ∑n1E[Xk∗T(max(k−1,n−k))]∑1nE[Xk∗T(max(k−1,n−k))] + O( n )
= ∑n1∑1n E[Xk]E[Xk] * E[T(max(k−1,n−k))]E[T(max(k−1,n−k))] + O( n )
= ∑n1∑1n 1n1n* E[T(max(k−1,n−k))]E[T(max(k−1,n−k))] + O( n )
根据max函数的对称性:
上式 ≤ 2n2n * ∑n−1⌊n2⌋∗∑⌊n2⌋n−1∗E[ T( k ) ]+O(n)最后我们用替换方法,不难得到+O(n)最后我们用替换方法,不难得到E [ T( n ) ]$ ≤ cn.
最坏情况线性时间的选择算法设计
1 . 将所有元素分成⌈n5⌉⌈n5⌉组元素,每组5个元素(最后一组可能有不足5个元素)
2 .找出这 ⌈n5⌉⌈n5⌉组中的中位数
3.递归的在⌈n5⌉⌈n5⌉个中位数中找到他们的中位数,记为m∗m∗
4.基于m∗m∗对所有元素进行划分,假设有x - 1个元素小于m∗m∗,n - x 个元素大于m∗m∗
若k = x ,则返回
若k < x ,则递归在小于m∗m∗元素选择第k大的元素
若k > x ,则递归在大于m∗m∗元素选择第k - x 大的元素
我们可以看见上面 第4 , 5 , 6 ,7 步与上面基于快排思想的算法无本质上的差别,而第1 , 2 , 3 步也可以理解为用一些代价来选择基准元素,使得最后划分不会太不均衡。比每组中位数小的元素画在上面,大的画在下面。比中位数的中位数小于的划分在左边,大于的划分在右边。
我们可以确定A区一定小于m∗m∗,D区一定大于m∗m∗ 而对于B、C部分我们无法知道它们与m∗m∗的关系。考虑最坏情况:B、C区(以及A或D)都在同一个子问题中,而我们要对它进行递归查找。则:
W(n)W(n) ≤ W(⌈n5⌉)W(⌈n5⌉) + W( 710710 * n + 5 ) + O( n ).
W(⌈n5⌉)W(⌈n5⌉) : 递归查找中位数的中位数。
W( 710710 * n + 5 ) :递归子问题求解。
O( n ) :划分操作
这里我们以A、B 、C三区为例,(对应的是B、C、D)。我们等价地来估计剩下的D小组,最少有多少个大于m∗m∗的元素。在所有⌈n5⌉⌈n5⌉组中至少有一半的小组,每组有三个比m∗m∗大,其中还有去除①中位数m∗m∗所在小组②最后可能不足5个元素的小组 。(我们求得是最少的元素个数)
所以A、B、C三组最多元素个数为 n - 3 ( 1212 * ⌈n5⌉⌈n5⌉ - 2) ≥≥ 710710 * n + 6 .
同样我们可以使用替换法来证明W( n ) = O( n ).
详细证明见机器工业出版社 黄宇的《算法设计与分析》。
替换方法详见《算法导论》
---------------------