算法设计与分析课程复习笔记6——统计算法

算法设计与分析课程复习笔记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小元素,需要与分割中心位置比较
第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(n1)=1+n+T(n1)=Θ(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)]n2k=n/2n1[T(k)]+O(n)

更好的选择算法
在最坏情况下选择开销为O(n)
采用改进的分割方法,不再是以序列的最后一个元素为分割中心

  1. 分成 ⌈ \lceil n/5 ⌉ \rceil
  2. 找到每组的中值
  3. 找到 ⌈ \lceil n/5 ⌉ \rceil 组中值的中值x
  4. 运用改进的分割算法在x处分割
  5. 如果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)

参考:任课教师邱德红教授的课件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值