演算法_第四章 淘汰與搜尋法.ppt

Download Report

Transcript 演算法_第四章 淘汰與搜尋法.ppt

淘汰與搜尋法
4
2016/8/7
演算法 _ 第四章
1
什麼叫淘汰與搜尋法

每一回合的處理都把搜尋的範圍減少一個固定比例

分成三個主要步驟:



2016/8/7
如果要處理的資料量已經夠少,那麼用直接的方式解決;否
則,把輸入資料分解成至少兩個獨立的小集合
淘汰掉一定不存在我們要的解的集合
針對可能包含我們要的解的集合遞迴地做步驟(2)的處理直到
可能包含我們要的解的集合已經小到可以用步驟(1)的直接處
理
演算法 _ 第四章
4-2
哪些問題適用淘汰與搜尋法?

如果一個問題的輸入資料可以予以刪除
一些而不會影響到我們最後要的解,那
麼這個問題就有可能適合用淘汰與搜尋
法
2016/8/7
演算法 _ 第四章
4-3
找劣幣問題

給定一個裝有 32 個硬幣的袋子,硬幣當
中可能有一個是劣幣

不僅如此,我們還知道劣幣的重量比真
幣輕

我們的工作是判斷袋子裡是不是有劣幣。
如果有的話,找出它
2016/8/7
演算法 _ 第四章
4-4
找劣幣問題

比較簡單,我們已知劣幣是比較輕的

但是,可能都是真幣
2016/8/7
演算法 _ 第四章
4-5
找劣幣問題
步驟一: 如果可能包含劣幣的硬幣數目還大於 2 則執行第二步,否則執行第三步;
步驟二: 將所有硬幣平均分成兩組,c1, c2;
比較 c1 與 c2;
如果 c1 = c2 則
//兩組都是真幣
確定沒有劣幣;
return;
否則
//輕的一組含有劣幣
淘汰掉比較重的一組;
回到步驟一;
步驟三: 假設這 2 枚硬幣分別是 A 與 B;
比較 A 與 B;
如果 A = B 則
沒有劣幣;
否則
比較輕的一個是劣幣;
2016/8/7
演算法 _ 第四章
4-6
找劣幣問題-更好的演算法
步驟一: 如果可能包含劣幣的硬幣數目還大於 3 則執行第二步,否則執行第三步;
步驟二: 將可能是劣幣的所有硬幣平均分成三組,分別用 c1, c2, c3 來代表;
比較 c1 與 c2;
如果 c1 = c2 則淘汰掉 c1 與 c2;
否則如果 c1 < c2 則淘汰掉 c2 與 c3;
否則淘汰掉 c1 與 c3;
回到步驟一;
步驟三: 假設這 3 枚硬幣分別是 A、B 與 C;
比較 A 與 B;
如果 AB 則
確定比較輕的一個是劣幣;
否則 {
比較 A 與 C;
如果 C < A 則 C 是劣幣
2016/8/7
否則確定沒有劣幣; }
演算法 _ 第四章
4-7
找劣幣問題

複雜度

T(n) = T(n/2) + a = (T(n/4) + a) + a = (T(n/8)
+ a) + a +a =  = T(1) + alog2 n = b +
alog2 n = O(log n)

T(n) = T(n/3) + a = (T(n/9) + a) + a =
(T(n/27) + a) + a +a =  = T(1) + alog3 n
= b + alog3 n = O(log n)
2016/8/7
演算法 _ 第四章
4-8
二元搜尋

middle := (left + right)/2 ?

如果越大的值被搜尋的機率越高

middle := 2(left + right)/3 ?
2016/8/7
演算法 _ 第四章
4-9
選出第 k 小的元素

給定一個含有 n 個元素的陣列 a[n],這個問題
要我們找出第 k 小的元素

例如,[12, 4, 5, 4, 5, 10, 2, 20]

如果 k = 1,我們得傳回2

如果k = 8,我們得傳回8

如果k = 6,我們得傳回10

如果k = 2,我們得傳回4
2016/8/7
演算法 _ 第四章
4-10
選出第 k 小的元素

中位數:k = n/2

我們可以先將 n 個元素排序過,然後再取出
a[k]

這麼做的話,我們至少需要 O(n log n) 的時間,
因為排序問題的複雜度下限是 (n log n)

我們以下要介紹的淘汰與搜尋法卻可以在 O(n)
的時間內就把這個問題解決掉
2016/8/7
演算法 _ 第四章
4-11
選出第 k 小的元素

假設我們隨意地從 S 中選出一個元素 v,利用
v 將集合 S 分割成三個子集合:小於 v 的元素、
等於 v 的元素、以及大於 v 的元素
2016/8/7
演算法 _ 第四章
4-12
選出第 k 小的元素


由於SL+Sv= 5,我們所要的第 8 小
元素因此是在 SR 裡,而且是 SR 裡的第 3
小元素
一般的情況
 Select ( S L , k )
k  SL

Select ( S , k )   v
S L  k  S L  Sv
 Select ( S , k - S - S ) k  S  S
R
L
v
L
v

2016/8/7
演算法 _ 第四章
4-13
選出第 k 小的元素

從 S 分割出 SL、Sv、SR 只需要 O(n) 的時
間

但是,我們卻因此可以將搜尋範圍由原
本的 S 縮小成 SL 或 SR

如何選擇 v?
2016/8/7
演算法 _ 第四章
4-14
最差情況下的最佳化演算法

n = 25且a = [2, 6, 8, 1, 4, 9, 20, 6, 22, 11, 9, 8, 4, 3, 7, 8,
16, 11, 10, 8, 2, 14, 15, 1, 12]

先將這 25 個元素分成 5 組:[2, 6, 8, 1, 4]、[9, 20, 6, 22,
11]、[9, 8, 4, 3, 7]、[8, 16, 11, 10, 8]、與[2, 14, 15, 1, 12]

這五組數字的中位數分別是:4, 11, 7, 10, 12

再取這五個中位數 [4, 11, 7, 10, 12] 的中位數是:10

這便是我們所選擇的 v 值

SL = {2, 6, 8, 1, 4, 9, 6, 9, 8, 4, 3, 7, 8, 8, 2, 1}、Sv = {10}、
而SR = {20, 22, 11, 16, 11, 14, 15, 12}
2016/8/7
演算法 _ 第四章
4-15
最差情況下的最佳化演算法
這些值都小於等於10
中位數
1
3
8
6
1
2
4
8
9
2
4
7
10
11
12
6
8
11
20
14
8
9
16
22
15
這些值都大於等於10
2016/8/7
演算法 _ 第四章
4-16
最差情況下的最佳化演算法

不管是小於等於 10 或是大於等於 10 的虛線方
形裡的元素個數都至少是S的1/4

何況沒框起來的元素也有可能小於等於(或大
於等於)10

因此,不管我們是要淘汰掉 Sv 與 SR 或者 SL 與
Sv,我們用中位數的中位數所選擇出的 v 值保
證我們至少可以淘汰掉 ¼ 的元素
2016/8/7
演算法 _ 第四章
4-17
最差情況下的最佳化演算法
2016/8/7
演算法 _ 第四章
4-18
最差情況下的最佳化演算法
步驟二:
【找出中位數的中位數 v,並且利用它將 a[low:high] 分成< v、=
v、> v 三類】
2.1
2.2
2.3
2.4
將 a[low:high] 分成 n/5 個子集合,每一個子集合含 5 個元素;
忽略多出來的元素;
令 m[i], 1 i  n/5 分別是上述 n/5 個子集合的中位數;
v := Select1(m, (n/5)/2, 1, n/5);
2.5
2.6
//假設 a[low:high]當中有 nv 個元素值等於 v
利用 v 切割 a[low:high] 使得 a[low:j] < v、a[j+1:j+nv] = v、
a[j+nv+1:high] > v;
2016/8/7
演算法 _ 第四章
4-19
最差情況下的最佳化演算法
步驟三:
【找到第 k 小元素的所在子陣列】
3.1 if ( (j-low+2)  k  (j+nv-low+2) ) then return v;
3.2 else if ( k  (j-low+1) ) then return Select1(a, k, low, j);
3.3 else return Select1(a, k - (j+nv-low+2), j+nv+1, high);
2016/8/7
演算法 _ 第四章
4-20
最差情況下的最佳化演算法

令 T(n) 表示執行 Select1(a, k, 1, n) 所需要
的時間,則
 T (n/5)  T (3n / 4)  an n  c
T ( n)  
nc
 b


其中 a, b, c 都是常數
利用歸納法很容易就可以證明 T(n) 
20an, n  1,即 T(n) = O(n)
2016/8/7
演算法 _ 第四章
4-21
平均情況下的最佳化演算法


從 a[low:high] 中隨機選擇一個做為 v 值
最壞情況複雜度因此將是 n + (n-1) + (n-2) + 
+ (n-k) = O(n2)

但是,這種情況發生的機率實在是很低

同樣也是發生機率很低的是我們每一次都選到
最好的元素,剛好使得SL, SR n/2

在這種情況下,T(n) = T(n/2) + an = O(n)
2016/8/7
演算法 _ 第四章
4-22
平均情況下的最佳化演算法

平均情況的複雜度會介於最佳情況的 O(n)
與最壞情況的 O(n2) 之間

比較靠近 O(n)?還是比較靠近 O(n2)?

幸運的是,它非常靠近最佳情況的 O(n)
2016/8/7
演算法 _ 第四章
4-23
平均情況下的最佳化演算法
75%
25%

隨機選擇一個 v 值它是介於第 25% ~ 75% 之間
的機率是0.5

因此,平均起來我們選擇兩個 v 值會有一個是
介於第25% ~ 75% 之間
2016/8/7
演算法 _ 第四章
4-24
平均情況下的最佳化演算法


因此,平均起來我們做兩次分割後可以
淘汰掉至少S/4
T(n)  T(3n/4) + O(n) = O(n)
2016/8/7
演算法 _ 第四章
4-25
平均情況下的最佳化演算法
步驟二:【將 a[low:high]分成< v、= v、> v 三類】
2.1
2.2
2.3
2.4
從 a[low:high]中隨機選出兩個元素 v1, v2;
利用 v1 將 a[low:high]分成< v1(SL)、= v1、> v1(SR)三類;
利用 v2 將 a[low:high]分成< v2(SL)、= v2、> v2(SR)三類;
令 v 為使得SL與SR較接近的 v1 或 v2;
2.5
2.6
//假設 a[low:high]當中有 nv 個元素值等於 v
假設 v 將 a[low:high]切割使得 a[low:j] < v、a[j+1:j+nv] = v、
a[j+nv+1:high] > v;
2016/8/7
演算法 _ 第四章
4-26