算法导论 学习笔记 第九章 中值和顺序统计

本章其实只讲了一个问题,那就是如何从一个数组当中用线性时间内找出第i个小的元素。

最小值和最大值
这个就比较简单了,直接挨个比,运行时间就是线性的,而且这就是最好的办法。
如何同时找出最小值和最大值咧?
这个其实也简单,那就记录两个数据呗。运行时间是找单个的两倍。
但是这个就不是最好的办法了。有一个比这个更好的方法。上面的办法是每一个元素需要比较两次,
而下面的方法是每两个元素需要比较三次。比上一个好一点
那就是我们不去一个一个比较,而是一对一对的比较,然后把小的跟最小值比较,大的跟最大值比较。厉害吧。
期望线性时间内的选择问题(这个翻译总感觉不通顺)平均情况嘛

Θ(n2)

就是我们平时的选择,不可能总是要求我们找出最小值和最大值。但是尽管不是找出最小值和最大值,平均情况下我们依然可以在线性时间内完成。

用的核心思想是分治法。最坏的情况下运行时间是
Θ(n2)

上伪代码

RANDOMIZED-SELECT(A,p,r,i)

if p = r
    then return A[p]
q ← RANDOMIZED-PARTITION(A,p,r)
k ← q - p + 1
if i = k
    then return A[q]
elseif i < k
    then return RANDOMIZED-SELECT(A,p,q-1,i)
else return RANDOMIZED-SELECT(A,q+1,r,i-k)
最坏的情况下以线性时间运行

上面的算法在最坏的情况下的运行时间是 Θ(n2) ,原因就是我们在最不幸运的时候每次划分
然后出现一边没有元素,一边n-1个元素的情况。这里就是用一种方法来保证不会出现这种情况。怎么来了咧
看书吧。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值