算法导论--在平均线性时间下选择元素

一般的选择问题比简单的选择最小值要难的多。但是,随着n的增大,它们所消耗的时间都是O(n)。这一次我们介绍一个基于分治法的算法来解决这个问题,叫做随机选择算法,英文名叫,RANDOMIZED-SELECT。这个算法跟快速排序很像,只不过它只在一边执行partition算法。这个区别导致这样的分析:苏日安快速排序的时间复杂度是O(nlgn),但是RANDOM-SELECT算法的平均时间是O(n),在元素都是互不相同的假设下。
RANDOMIZED-SELECT 用RANDOMIZED-PARTITION程序。就像随机化快速排序,这是一个随机化的算法。因为它的部分行为是基于一个随机数产生器产生的随机数的。以下的伪代码返回i th smallest, 即是第i小的元素,在一个数组里。

这里写图片描述

来解释以下:
第1-2行:这里是递归的返回条件之一,当A[p…r]之间包含的只有一个元素的时候,这种情况下,i == 1, 并且我们在第2行就直接返回A[p],就是i th smallest 元素。
第3行:调用随机化partition算法,这时候A[p…q-1]小于等于A[q],并且A[q+1….r]大于A[q]。就像快速排序,我们将A[q]命名为 pivot元素
第4行:计算子数组A[p..q]的元素个数k
第5行:检查A[q]是否是i th smallest元素,如果是,就直接返回A[q],否则的话,算法需要决定i th smallest元素在哪个子数组里,A[p…q-1]或者是A[q+1….r]
第7-9行:判断我们想要的元素在哪个子数组,然后递归执行。

时间复杂度:最坏情况下这个算法的时间复杂度是O(n^2),也就是我们特别倒霉,每次划分都划分出了最大的剩下的元素。但是平均情况下,这个算法有着线性的复杂度O(n),这里就不证明了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值