Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

(講義ノート)乱択アルゴリズム第1回

入力の仮定はなく、アルゴリズムと保証は最悪時で成り立つ。

表記

  • XX 確率変数(実数をとる)
  • E[X]\mathbb{E}[X] 確率変数XXの期待値
    • 独立変数でなくても、期待値の線形性がある。期待値の和は和の期待値。
    E[X1+X2]=E[X1]+E[X2]\mathbb{E}[X_1 + X_2] = \mathbb{E}[X_1] + \mathbb{E}[X_2]

クイックソート(乱択アルゴリズムの解析の例)

実数の配列AAを与えられて、ソートをする。

アルゴリズムは以下の通り

  1. ∣A∣=1|A|=1ならば、そのまま出力して終わり。それ以外の時はAAからpivotという値を1つ一様に選びaaとする。
  2. ∣A∣|A|の元の中でaaより小さいものを配列LL、大きいものをRRに振り分けておく(L,RL,Rの中でまだソートできてない)。
  3. L,RL, Rを再帰的にソートする。

pivotの選び方は乱択なので、最悪だとO(∣A∣2)O(|A|^2)の計算量となる。では期待値はどうなのか?

平均的にはpivotは真ん中を選びそうなので、長さは∣L∣=∣R∣=∣A∣/2|L|=|R|=|A|/2となる。これで漸化式は以下のようになる。

T(n)=2T(n/2)+O(n)T(n)=2T(n/2) + O(n)

マスター定理によってO(nlog⁡n)O(n \log n)とわかる。普通に樹形図を書いていっても各段階でかかるのがO(n)O(n)だとわかり深さがO(log⁡n)O(\log n)なので実際正しい。

これをしっかりやるには、以下のようになる。

1≤i<j≤∣A∣1 \leq i < j \leq |A|に対して、XijX_{ij}は

  • 11 Ai,AjA_i, A_jが比較された
  • 00 Ai,AjA_i, A_jが比較されない

(ちなみにこれは指示関数という名前)

E[∑1≤i<j≤∣A∣Xij]=∑1≤i<j≤∣A∣E[Xij]\mathbb{E}[\sum_{1 \leq i < j \leq |A|} X_{ij}] = \sum_{1 \leq i < j \leq |A|} \mathbb{E} [X_{ij}]

総比較回数の期待値を計算すると、確率変数本体の期待値となり結局Ai,AjA_i, A_jが比較される確率を調べればよい。

お互いが比較されるには、pivotにAi,AjA_i, A_jの一方が選ばれるときである。これの確率は、pivotがAi,AjA_i, A_jよりいずれも大きい、小さい場合は再帰的にやればよい。結局間に入ってるものだけ考えればよい。あいだにはいるのはj−i+1j-i+1個あるので、E[Xij]=2/(j−i+1)\mathbb{E}[X_{ij}] = 2/(j-i+1)となる。

これをもって計算すると、

∑1≤i<j≤∣A∣E[Xij]=∑i=1∣A∣∑j=i+1∣A∣2j−i+1\sum_{1 \leq i < j \leq |A|} \mathbb{E} [X_{ij}] = \sum_{i=1}^{|A|} \sum_{j=i+1}^{|A|} \frac{2}{j-i+1}

k=j−ik=j-iとすると以下のようにできる。

2∑i=1∣A∣∑k=1∣A∣−i1k+1=2∑i=1∣A∣log⁡(∣A∣−2+i)=O(∣A∣log⁡∣A∣)2 \sum_{i=1}^{|A|} \sum_{k=1}^{|A|-i} \frac{1}{k+1} = 2 \sum_{i=1}^{|A|} \log (|A|-2+i) = O(|A| \log |A|)

Kargerの最小カットアルゴリズム

G=(V,E)G=(V,E)が与えられ、それの最小カットを計算する。

Tips: 縮約=2つの頂点を1つにまとめるかんじ。

アルゴリズムは以下の通り

  1. GGが3頂点以上持つとき、辺を1本一様に選びそれを縮約する。
  2. これを続けて、最後に残った2頂点の間の枝数を出力する。
  3. この流れをある程度繰り返して得られた数を最小カットだとする。

最小カットC⊆EC \subseteq Eを固定する(つまり、CC以外の枝を縮約してもCCは残る)

ϵi\epsilon_iを、ii頂点残っているときにCCを縮約しない事象とする。

最後の最後までCCを残すというのは、以下の確率で計算される。

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[\bigcap_{j=3}^N \epsilon_j] = Pr[\epsilon_N] Pr[\bigcap_{j=3}^{N-1} \epsilon_j | \epsilon_N] \\ = Pr[\epsilon_N] Pr[\epsilon_{N-1} | \epsilon_i] Pr[\epsilon_{N-2} | \epsilon_N \cap \epsilon_{N-1}] \cdots

ここで、Pr[ϵj∣⋂k=j+1Nϵk]Pr[\epsilon_j | \bigcap_{k=j+1}^N \epsilon_k]は、今まで選ばれなかったという条件の下での頂点jj個存在するときでも選ばれなかったという事象の確率。なので、1−∣C∣/e1 - |C|/e、eeはその時の枝数と簡単に得ることができる。

枝数はj×∣C∣/2j \times |C| / 2で抑えることができる(残っている頂点の数で考えると自明)ので、以下の不等式が成り立つ。

1−∣C∣e≤1−2j1 - \frac{|C|}{e} \leq 1 - \frac{2}{j}

これを用いることで、先ほどの乗算の長い列に代入することで、

Pr[ϵN]Pr[ϵN−1∣ϵi]Pr[ϵN−2∣ϵN∩ϵN−1]⋯≥∏j=3N(1−2j)=∏j=3Nj−2j=13⋅24⋅35⋯N−4N−2⋅N−3N−1⋅N−2N=1⋅2(N−1)N=2N(N−1)Pr[\epsilon_N] Pr[\epsilon_{N-1} | \epsilon_i] Pr[\epsilon_{N-2} | \epsilon_N \cap \epsilon_{N-1}] \cdots \\ \geq \prod _{j=3}^N (1 - \frac{2}{j}) = \prod _{j=3}^N \frac{j-2}{j} = \frac{1}{3} \cdot \frac{2}{4} \cdot \frac{3}{5} \cdots \frac{N-4}{N-2} \cdot \frac{N-3}{N-1} \cdot \frac{N-2}{N} \\ = \frac{1 \cdot 2 }{(N-1)N} = \frac{2}{N(N-1)}

このことから、少なくとも2/N(N−1)2/N(N-1)の確率で、最小カットが見つかるということ。KargerのアルゴリズムはこれをCN2C N^2回繰り返すというもの。

(1−2N(N−1))CN2≤(1−1N2)CN2=e−2C(1-\frac{2}{N(N-1)})^{CN^2} \leq (1 - \frac{1}{N^2})^{CN^2} = e^{-2C}

ここで、C=5C=5とすれば、0.000050.00005以下の確率となり割と現実的であると言える。