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(A2)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(nlogn)O(n \log n)とわかる。普通に樹形図を書いていっても各段階でかかるのがO(n)O(n)だとわかり深さがO(logn)O(\log n)なので実際正しい。

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

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

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

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

E[1i<jAXij]=1i<jAE[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よりいずれも大きい、小さい場合は再帰的にやればよい。結局間に入ってるものだけ考えればよい。あいだにはいるのはji+1j-i+1個あるので、E[Xij]=2/(ji+1)\mathbb{E}[X_{ij}] = 2/(j-i+1)となる。

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

1i<jAE[Xij]=i=1Aj=i+1A2ji+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=jik=j-iとすると以下のようにできる。

2i=1Ak=1Ai1k+1=2i=1Alog(A2+i)=O(AlogA)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. この流れをある程度繰り返して得られた数を最小カットだとする。

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

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

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

Pr[j=3Nϵj]=Pr[ϵN]Pr[j=3N1ϵjϵN]=Pr[ϵN]Pr[ϵN1ϵi]Pr[ϵN2ϵNϵN1]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[ϵjk=j+1Nϵk]Pr[\epsilon_j | \bigcap_{k=j+1}^N \epsilon_k]は、今まで選ばれなかったという条件の下での頂点jj個存在するときでも選ばれなかったという事象の確率。なので、1C/e1 - |C|/eeeはその時の枝数と簡単に得ることができる。

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

1Ce12j1 - \frac{|C|}{e} \leq 1 - \frac{2}{j}

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

Pr[ϵN]Pr[ϵN1ϵi]Pr[ϵN2ϵNϵN1]j=3N(12j)=j=3Nj2j=132435N4N2N3N1N2N=12(N1)N=2N(N1)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(N1)2/N(N-1)の確率で、最小カットが見つかるということ。KargerのアルゴリズムはこれをCN2C N^2回繰り返すというもの。

(12N(N1))CN2(11N2)CN2=e2C(1-\frac{2}{N(N-1)})^{CN^2} \leq (1 - \frac{1}{N^2})^{CN^2} = e^{-2C}

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