算法设计与分析课程复习笔记6——统计算法
统计算法
修路问题
Given (x,y) coordinates of N houses, where should you build road parallel to x-axis to minimize construction cost of building driveways?
最终正确的解决方案:将街道置于Y坐标的中间
序列统计
- 求极大和极小
- 求第k小元素
求极小或极大
Minimum(A)
min←A[1]
for i=2……n
do if A[i] < min
then min ← A[i]
return min
Lemma: The minimum or maximum of a set of n elements can be found using n – 1 comparisons.(通过n-1次比较能找到n个元素的极大或极小)
同时求极大和极小
简单答案:极大和极小可通过2n-2次比较得到
更好的办法:
Min-Max(A)
for i = 1…n / 2
do if A[2i – 1] ≤ A[2i]
then B[i] ← A[2i – 1]
C[i] ← A[2i]
else B[i] ← A[2i]
C[i] ← A[2i – 1]
min ← Minimum(B)
max ← Maximum(C)
return (min, max)
n/2次得到B和C,从B中找到最小的,从C中找到最大的。
总共比较次数:3n/2-2
从序列中选出第i小元素
想法:
用快速排序中的分割算法对序列进行分割
在分割后的一边寻找第i小元素,需要与分割中心位置比较
时间开销:
可以以Θ(n)开销完成
随机选择算法
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 //pivot value is the answer
then return A[q]
else if i < k
then return RANDOMIZED-SELECT(A, p, q-1, i )
else return RANDOMIZED-SELECT(A, q + 1, r, i-k)
分析:
最坏情况: 以最大或最小为分割中心,分隔开销Θ(n)
平均情况:
更好的选择算法
在最坏情况下选择开销为O(n)
采用改进的分割方法,不再是以序列的最后一个元素为分割中心
- 分成 n/5 组
- 找到每组的中值
- 找到 n/5 组中值的中值x
- 运用改进的分割算法在x处分割
- 如果i=k,返回x结束;否则,在左右递归求解
example:
寻找第6小的元素
A = {12, 34, 0, 3, 22, 4, 17, 32, 3, 28, 43, 82, 25, 27,
34, 2 ,19 ,12 ,5 ,18 ,20 ,33, 16, 33, 21, 30, 3, 47}
1.分成 n/5 组。
1️⃣12,34,0,3,22
2️⃣4,17,32,3,28
3️⃣43,82,25,27,34
4️⃣2,19,12,5,18
5️⃣20,33,16,33,21
6️⃣30,3,47
2.找到每组的中值。
1️⃣0,3,12,22,34
2️⃣3,4,17,28,32
3️⃣25,27,34,43,82
4️⃣2,5,12,18,19
5️⃣16,20,21,33,33
6️⃣3,30,47
3.找到 n/5 组中值的中值x。
12,12,17,21,30,34
4. 运用改进的分割算法在x处分割。
第一部分:12, 0, 3, 4, 3, 2, 12, 5, 16, 3
pivot:17【position of the pivot is q = 11】
第二部分:34, 22, 32, 28, 43, 82, 25, 27, 34, 19, 18, 20, 33, 33, 21, 30, 47
5.在第一部分递归求解。
1.O(n)
2.O(n)
3.T(
n/5
)
4.O(n)
5.≤ T(7n/10 + 6)——阅读教材
T(n)=T(
n/5
)+T(7n/10 + 6)+O(n)
参考:任课教师邱德红教授的课件