本章其实只讲了一个问题,那就是如何从一个数组当中用线性时间内找出第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个元素的情况。这里就是用一种方法来保证不会出现这种情况。怎么来了咧
看书吧。。。。