Algorithms Introduction 9章
- 10. 期待計算量を求める
•
最悪の場合: p-r-1のサブ配列を再帰的に処理 → Θ(n^2)
for(i = n;i > 0;i ̶) { for (j = 0; j < i; j++) {分割処理} }
•
実際に興味があるのは期待計算量
T(n) をRANDOMIZED-SELECT()の計算量だとして
E[T(n)]を求める
•
X_k = I{サブ配列A[p..q] が k個の要素を持つ}
•
E[X_k] = 1/n
- 15. 期待計算量を求める
•
cn/4 - c/2 - an
い
0→n
2c/(c-4a) になれば良
•
このためには c > 4a となる必要がある
•
T(n)が n < 2c/(c-4a) において O(1)とすれば
E[T(n)] = O(n)
- 16. より良い方法 : SELECT
•
最悪の場合の計算量が O(n)のアルゴリズム: SELECT アルゴリズム
(Median of Medians)
1. n個の要素をceil(n/5)のグループに分ける
2. それぞれのグループの中央値を挿入ソートで求める
3. 2. で求めた中央値集合の中央値をSELECTアルゴルズムを再帰的に適用して求
める (求めた値をxとする)
4. 3. で求めた中央値の中央値を使って入力配列を分割する
具体的にはkが小さい方の配列の要素数+1の数だとすると,xはk番目に小さい
数でn-kの要素が大きい方の配列に入る
5. i == k なら x を返す.i < k なら SELECTアルゴリズムを小さい方の配列に適用,
i > k ならSELECTアルゴリズムを大きい方の配列に適用
- 18. 最悪計算量の見積もり
step 2 で求めた複数の中央値の半分はxと同じか大きい
矢印 ceil(n/5) / 2 個のグループのうち最低でも3つの要素はxより小さい (要
素が5個未満の最後のグループを除く).従って,xより大きい要素の数はせい
ぜい n- n/5/2*3 = 7n/10
•
同じように 3n/10-6 個の要素がxより小さい → step 5で最悪の場合 7n/10
+ 6 の要素に対して再帰的に処理をおこなう
- 20. 最悪計算量の見積もり
T(n) cn (c:大きな定数)と仮定
さらに O(n) の上限 をan (a:定数) とする
•
-cn/10 + 7c + an 0 なら T(n) cn
→ c 10a(n/(n-70)) (n 70のとき)
n 140 としたので n/(n-70) 2, c 20aのように選べば上の等
式を満たす
実際には n は 70より大きければ,cを適切に選べば等式は成り立つ
- 21. 最悪計算量の見積もり
再掲
•
•
ポイントは,n/5 + 7n/10 = 9n/10 < n であること
•
分割数 x = 5 以外の場合は?
→ とりあえず xは奇数 (偶数だと中央値に偏りが生じる)
•
x = 3 の場合:
T(n) T(n/3) + T(2n/3) + O(n) → n/3+2n/3 = n これは
(中央値の中央値x より最低でも n/3/2*2 の要素が大きい → 最大でもn - n/3/2*2 = 2n/3の要
素がxより小さい)
•
x = 7,9,11,… でも良いが,そうすると分割にかかる時間が増える