算法设计c语言线性时间选择,线性时间选择

本文探讨了如何在无序线性表中利用快速排序的思想,通过分治策略在O(n)时间内找到第k大的元素。算法涉及快速划分元素、递归搜索及划分均匀性的考量。作者详细介绍了基于中位数的分组法,展示了如何减少查找次数并达到线性时间复杂度。
摘要由CSDN通过智能技术生成

问题 :在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 ).

详细证明见机器工业出版社 黄宇的《算法设计与分析》。

替换方法详见《算法导论》

---------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值