一、 最大值和最小值问题
1、 找到最大值和最小值的程序
Minimum(A)
1 min<--A[1]
2 for i<--2 to length[A]
3 do if A[i] < min
4 then min <-- A[i]
5 return min
将以上的比较看做一次锦标赛,除了最终获胜者以外,每个元素至少输掉了一场比赛,因此,为了确定最小(大)值,至少要进行n-1次比较。
2、 同时找出最大值和最小值:可以按照上面的程序,多一次比较,总共比较2n-2次。这是 渐近最优的(n)。
3、 事实上至多进行3*floor(n/2)次比较就可以确定最大值和最小值:将一对元素进行比较,将其中较大的与最大值作比较,较小的与最小值作比较。
二、 以期望线性时间做选择
1、 一般选择问题:找出数组中第i大的元素。看起来比找最小值要复杂,但实际上两种问题的渐进运行时间相同,都是Θ(n)。
2、 Randomized-Select算法:
a、 采用分治法,以quick-sort为模型;
b、 区别在于只处理划分的一边;
c、 期望时间为Θ(n)。
Randomized-Select(A, p, r, i)
1 if p = r
2 then return A[p]
3 q = randomized-partition(A, p, r)
4 k <-- q - p + 1
5 if i = k
6 then return A[k]
7 else if i < k
8 then return Randomized-Select(A, p, q-1, i)
9 else
10 return Randomized-Select(A, q+1, r, i-k)
算法分析:a、 Randomized-Select算法的最坏情况运行时间为Θ(n^2);即使是用它来寻找最大值和最小值最坏情况运行时间也是Θ(n^2)。
b、 算法的平均情况性能较好:Θ(n);<