5 付録

5.1 クイックソートの計算量

QuickSort()関数が最初に呼び出されたときの比較
        lower<=upper&&data[lower]<=div
        lower<=upper&&data[upper]>div
の実行回数 は、$ N+1$回である。そして、再帰 呼び出しにより、$ \alpha$ 個と$ \beta$個の場合のQuickSort()が呼び出されることにな る。$ N$個の時のトータルの比較回数を$ a_N$として、これらの関係は、

$\displaystyle a_N=N+1+a_\alpha+a_\beta$ (1)

となる。もちろん、$ \alpha$$ \beta$は、$ 1$$ N-1$の値を取りうる。そして、 sort[]に格納されている値がランダムであれば、同じ確率で$ 1$$ N-1$の値をとる。さ らに、$ \alpha$$ \beta$の和は$ N$になることはクイックソートのアルゴリズムから自明 である。したがって、$ a_N$の期待値は、

$\displaystyle a_N$ $\displaystyle =N+1+\frac{1}{N-1}\left(a_1+a_2+a_3+\cdots+a_{N-1} +a_{N-1}+a_{N-2}+a_{N-3}+\cdots+a_1\right)$    
  $\displaystyle =N+1+\frac{2}{N-1}\sum_{k=1}^{N-1}a_k$ (2)

となる。この漸化式から、$ a_N$を求めることになるが、計算は結構大変である。まず、 式(2)を

$\displaystyle (N-1)a_N=(N+1)(N-1)+2\sum_{k=1}^{N-1}a_k$ (3)

と変形しておく。つぎに、この式の$ N$$ N-1$にした場合の式

$\displaystyle (N-2)a_{N-1}=N(N-2)+2\sum_{k=1}^{N-2}a_k$ (4)

を利用する。式(3)から式(4)の辺々を差し引いて整理す ると、

$\displaystyle (N-1)a_N-(N-2)a_{N-1}$ $\displaystyle =(N+1)(N-1)-N(N-2)+2a_{N-1}$ (5)

となる。さらに、整理を進めると

$\displaystyle (N-1)a_N-Na_{N-1}$ $\displaystyle =2N-1$ (6)

となる。両辺を、$ (N-1)N$で割ると、

$\displaystyle \frac{a_N}{N}-\frac{a_{N-1}}{N-1}$ $\displaystyle =\frac{2N-1}{(N-1)N}$    
  $\displaystyle =\frac{1}{N}+\frac{1}{N-1}$ (7)

となる。ここで、$ a_N/N$$ b_N$と置くと、

$\displaystyle b_N-b_{N-1}=\frac{1}{N}+\frac{1}{N-1}$ (8)

となり、階差数列を用いて容易に計算できる。すなわち、

$\displaystyle b_N=b_2+\sum_{k=3}^N\left(\frac{1}{k}+\frac{1}{k-1}\right)$ (9)

である。$ a_2=3$より、$ b_2=3/2$となるので、

$\displaystyle b_N$ $\displaystyle =\frac{3}{2}+\sum_{k=3}^N\frac{1}{k}+\sum_{k=3}^N\frac{1}{k-1}$    
  $\displaystyle =\frac{3}{2}+\left(\sum_{k=1}^N\frac{1}{k}-1-\frac{1}{2}\right)+ \left(\sum_{k=1}^N\frac{1}{k}-1-\frac{1}{N}\right)$    
  $\displaystyle =-\frac{3}{2}-\frac{1}{N}+2\sum_{k=1}^N\frac{1}{k}$ (10)

となる。ここで、$ N$が大きい場合、 $ \sum_{k=1}^N\frac{1}{k}$ $ \log_eN+\gamma$に近 づくことが知られている4$ \gamma$はオイラー数と言われる定数で、その値は0.577$ \cdots$である。したがって、 $ N$が大きい場合、

$\displaystyle b_N\simeq-\frac{3}{2}-\frac{1}{N}+2(\log_eN+\gamma)$ (11)

となる。右辺の$ \log_eN$は他の項に比べて大きな値を取る5。したがって、

$\displaystyle b_N\simeq 2\log_eN$ (12)

となる。$ b_N$の定義から、

$\displaystyle a_N \simeq 2N\log_eN$ (13)

となる。

$ a_N$sort[]の要素の比較回数を表す。したがって、$ N$が大きい場合の比較回数は、 $ 2N\log_eN$となる。


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年10月27日


no counter