算法设计与分析课程复习笔记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)
T
(
n
)
=
O
(
1
)
[
选
择
分
割
中
心
]
+
Θ
(
n
)
[
分
割
]
+
T
(
n
−
1
)
=
1
+
n
+
T
(
n
−
1
)
=
Θ
(
n
2
)
T(n)=O(1)[选择分割中心]+Θ(n)[分割]+T(n-1)=1+n+T(n-1)=Θ(n^2)
T(n)=O(1)[选择分割中心]+Θ(n)[分割]+T(n−1)=1+n+T(n−1)=Θ(n2)
平均情况:
E
[
T
(
n
)
]
≤
2
n
∑
k
=
⌊
n
/
2
⌋
n
−
1
[
T
(
k
)
]
+
O
(
n
)
E[T(n)]\leq \frac2n\sum_{k=\lfloor{n/2}\rfloor}^{n-1}[T(k)]+O(n)
E[T(n)]≤n2∑k=⌊n/2⌋n−1[T(k)]+O(n)
更好的选择算法
在最坏情况下选择开销为O(n)
采用改进的分割方法,不再是以序列的最后一个元素为分割中心
- 分成 ⌈ \lceil ⌈n/5 ⌉ \rceil ⌉组
- 找到每组的中值
- 找到 ⌈ \lceil ⌈n/5 ⌉ \rceil ⌉组中值的中值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.分成 ⌈ \lceil ⌈n/5 ⌉ \rceil ⌉组。
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.找到 ⌈ \lceil ⌈n/5 ⌉ \rceil ⌉组中值的中值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(
⌈
\lceil
⌈n/5
⌉
\rceil
⌉)
4.O(n)
5.≤ T(7n/10 + 6)——阅读教材
T(n)=T(
⌈
\lceil
⌈n/5
⌉
\rceil
⌉)+T(7n/10 + 6)+O(n)
T
(
n
)
=
O
(
n
)
T(n)=O(n)
T(n)=O(n)
参考:任课教师邱德红教授的课件