入力の仮定はなく、アルゴリズムと保証は最悪時で成り立つ。
表記
- X 確率変数(実数をとる)
- E[X] 確率変数Xの期待値
- 独立変数でなくても、期待値の線形性がある。期待値の和は和の期待値。
E[X1+X2]=E[X1]+E[X2]
クイックソート(乱択アルゴリズムの解析の例)
実数の配列Aを与えられて、ソートをする。
アルゴリズムは以下の通り
- ∣A∣=1ならば、そのまま出力して終わり。それ以外の時はAからpivotという値を1つ一様に選びaとする。
- ∣A∣の元の中でaより小さいものを配列L、大きいものをRに振り分けておく(L,Rの中でまだソートできてない)。
- L,Rを再帰的にソートする。
pivotの選び方は乱択なので、最悪だとO(∣A∣2)の計算量となる。では期待値はどうなのか?
平均的にはpivotは真ん中を選びそうなので、長さは∣L∣=∣R∣=∣A∣/2となる。これで漸化式は以下のようになる。
T(n)=2T(n/2)+O(n) マスター定理によってO(nlogn)とわかる。普通に樹形図を書いていっても各段階でかかるのがO(n)だとわかり深さがO(logn)なので実際正しい。
これをしっかりやるには、以下のようになる。
1≤i<j≤∣A∣に対して、Xijは
- 1 Ai,Ajが比較された
- 0 Ai,Ajが比較されない
(ちなみにこれは指示関数という名前)
E[∑1≤i<j≤∣A∣Xij]=∑1≤i<j≤∣A∣E[Xij] 総比較回数の期待値を計算すると、確率変数本体の期待値となり結局Ai,Ajが比較される確率を調べればよい。
お互いが比較されるには、pivotにAi,Ajの一方が選ばれるときである。これの確率は、pivotがAi,Ajよりいずれも大きい、小さい場合は再帰的にやればよい。結局間に入ってるものだけ考えればよい。あいだにはいるのはj−i+1個あるので、E[Xij]=2/(j−i+1)となる。
これをもって計算すると、
∑1≤i<j≤∣A∣E[Xij]=∑i=1∣A∣∑j=i+1∣A∣j−i+12 k=j−iとすると以下のようにできる。
2∑i=1∣A∣∑k=1∣A∣−ik+11=2∑i=1∣A∣log(∣A∣−2+i)=O(∣A∣log∣A∣) Kargerの最小カットアルゴリズム
G=(V,E)が与えられ、それの最小カットを計算する。
Tips: 縮約=2つの頂点を1つにまとめるかんじ。
アルゴリズムは以下の通り
- Gが3頂点以上持つとき、辺を1本一様に選びそれを縮約する。
- これを続けて、最後に残った2頂点の間の枝数を出力する。
- この流れをある程度繰り返して得られた数を最小カットだとする。
最小カットC⊆Eを固定する(つまり、C以外の枝を縮約してもCは残る)
ϵiを、i頂点残っているときにCを縮約しない事象とする。
最後の最後までCを残すというのは、以下の確率で計算される。
Pr[⋂j=3Nϵj]=Pr[ϵN]Pr[⋂j=3N−1ϵj∣ϵN]=Pr[ϵN]Pr[ϵN−1∣ϵi]Pr[ϵN−2∣ϵN∩ϵN−1]⋯ ここで、Pr[ϵj∣⋂k=j+1Nϵk]は、今まで選ばれなかったという条件の下での頂点j個存在するときでも選ばれなかったという事象の確率。なので、1−∣C∣/e、eはその時の枝数と簡単に得ることができる。
枝数はj×∣C∣/2で抑えることができる(残っている頂点の数で考えると自明)ので、以下の不等式が成り立つ。
1−e∣C∣≤1−j2 これを用いることで、先ほどの乗算の長い列に代入することで、
Pr[ϵN]Pr[ϵN−1∣ϵi]Pr[ϵN−2∣ϵN∩ϵN−1]⋯≥∏j=3N(1−j2)=∏j=3Njj−2=31⋅42⋅53⋯N−2N−4⋅N−1N−3⋅NN−2=(N−1)N1⋅2=N(N−1)2 このことから、少なくとも2/N(N−1)の確率で、最小カットが見つかるということ。KargerのアルゴリズムはこれをCN2回繰り返すというもの。
(1−N(N−1)2)CN2≤(1−N21)CN2=e−2C ここで、C=5とすれば、0.00005以下の確率となり割と現実的であると言える。