1 整列の問題と、示すべき三つのこと
定義 1.1 (整列の問題). 全順序が与えられた集合の相異なる要素からなる列a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a 1 , a 2 , … , a n を入力とする。[ n ] [n] [ n ] の置換π \pi π でa π ( 1 ) < a π ( 2 ) < ⋯ < a π ( n ) a_{\pi(1)} < a_{\pi(2)} < \cdots < a_{\pi(n)} a π ( 1 ) < a π ( 2 ) < ⋯ < a π ( n ) を満たすものを求める問題を整列 という。入力の要素が相異なるとき、このπ \pi π はただ一つに定まる。手続きの出力は、この順に並べ替えた列a π ( 1 ) , … , a π ( n ) a_{\pi(1)}, \dots, a_{\pi(n)} a π ( 1 ) , … , a π ( n ) とする。
整列の手続きについて示すことは、次の三つです。第一は、停止したときの出力が入力の要素を並べ替えた列であり、かつ昇順に並んでいることです。第二は、どの入力に対しても有限回の操作で停止することです。第三は、操作の回数の評価です。本記事では、操作の回数を要素どうしの比較の回数で測ります。
2 併合による整列
併合による整列は、列を二つに分け、それぞれを整列してから、二つの整列済みの列を一つに併せます。最後の操作を先に定めます。
定義 2.1 (併合). 昇順に並んだ二つの列x 1 < x 2 < ⋯ < x p x_1 < x_2 < \cdots < x_p x 1 < x 2 < ⋯ < x p とy 1 < y 2 < ⋯ < y q y_1 < y_2 < \cdots < y_q y 1 < y 2 < ⋯ < y q を入力とし、次の手順を併合 という。
i ← 1 i \leftarrow 1 i ← 1 、j ← 1 j \leftarrow 1 j ← 1 とし、出力列z z z を空の列とする。
i ≤ p i \le p i ≤ p かつj ≤ q j \le q j ≤ q である間、次を繰り返す。x i x_i x i とy j y_j y j を比較する。x i < y j x_i < y_j x i < y j ならばx i x_i x i をz z z の末尾へ加えてi ← i + 1 i \leftarrow i+1 i ← i + 1 とし、そうでなければy j y_j y j をz z z の末尾へ加えてj ← j + 1 j \leftarrow j+1 j ← j + 1 とする。
繰り返しを抜けたのち、x i , … , x p x_i, \dots, x_p x i , … , x p とy j , … , y q y_j, \dots, y_q y j , … , y q のうち残っているほうを、そのままの順でz z z の末尾へ加え、z z z を出力する。
正しい答えを返すことは、繰り返しのたびに保たれる条件によって示します。
補題 2.2 (併合の正当性). 定義 2.1 の手順は、x 1 , … , x p x_1, \dots, x_p x 1 , … , x p とy 1 , … , y q y_1, \dots, y_q y 1 , … , y q のすべての要素をちょうど一度ずつ含む昇順の列を出力する。
証明.
主張 2.2.1. 手順 2 の各回を始める時点で、次の三つが成り立ちます。
出力列z z z は昇順に並んでいます。
z z z の要素の全体は{ x 1 , … , x i − 1 } ∪ { y 1 , … , y j − 1 } \{x_1, \dots, x_{i-1}\} \cup \{y_1, \dots, y_{j-1}\} { x 1 , … , x i − 1 } ∪ { y 1 , … , y j − 1 } に一致し、どの要素もちょうど一度ずつ現れます。
z z z のどの要素も、x i , … , x p x_i, \dots, x_p x i , … , x p とy j , … , y q y_j, \dots, y_q y j , … , y q のどの要素より小さいです。
証明. 繰り返しに入る前はi = j = 1 i = j = 1 i = j = 1 でz z z は空なので、三つの主張はすべて空虚に成り立ちます。
一回の繰り返しを始める時点で三つの主張が成り立っているとし、x i < y j x_i < y_j x i < y j の場合を考えます(そうでない場合も、x x x とy y y の役割を入れ替えれば同じです)。手順はx i x_i x i をz z z の末尾へ加えます。主張 2.2.1 (3) によりz z z のどの要素もx i x_i x i より小さいので、x i x_i x i を末尾に加えた列は昇順のままであり、主張 2.2.1 (1) が保たれます。i i i が1 1 1 増えるので、要素の全体についての主張 2.2.1 (2) も保たれます。主張 2.2.1 (3) については、加えたx i x_i x i がx i + 1 , … , x p x_{i+1}, \dots, x_p x i + 1 , … , x p より小さいこと(入力が昇順であること)と、x i < y j < y j + 1 < ⋯ < y q x_i < y_j < y_{j+1} < \cdots < y_q x i < y j < y j + 1 < ⋯ < y q であることから、x i x_i x i は残っているどの要素より小さく、z z z の他の要素についてはもとの主張 2.2.1 (3) がそのまま使えます。よって三つとも保たれます。▨
繰り返しを抜けた時点ではi > p i > p i > p またはj > q j > q j > q です。i > p i > p i > p の場合、残っているのはy j , … , y q y_j, \dots, y_q y j , … , y q だけであり、主張 2.2.1 (3) によりこれらはz z z のどの要素よりも大きく、しかも昇順に並んでいます。したがって手順 3 でこれらを末尾へ加えた列は昇順であり、主張 2.2.1 (2) とあわせて、入力の全要素をちょうど一度ずつ含みます。j > q j > q j > q の場合も同様です。▨
補題 2.3 (併合の停止性と比較回数). 定義 2.1 の手順は必ず停止し、行う比較の回数はp + q − 1 p + q - 1 p + q − 1 以下である。
証明. 量μ = ( p − i + 1 ) + ( q − j + 1 ) \mu = (p - i + 1) + (q - j + 1) μ = ( p − i + 1 ) + ( q − j + 1 ) を考えます。手順 2 の各回でi i i またはj j j のちょうど一方が1 1 1 増えるので、μ \mu μ はちょうど1 1 1 減ります。また繰り返しの条件i ≤ p i \le p i ≤ p かつj ≤ q j \le q j ≤ q のもとでμ ≥ 2 > 0 \mu \ge 2 > 0 μ ≥ 2 > 0 です。μ \mu μ は非負の整数で毎回真に減るので、繰り返しは有限回で終わり、手順 3 は繰り返しを含まないので、手続き全体が停止します。
比較は手順 2 の各回でちょうど一回行われるので、比較の回数は繰り返しの回数に等しく、繰り返しの回数はz z z へ加えられた要素の個数に等しくなります。繰り返しを抜けた時点でi > p i > p i > p またはj > q j > q j > q ですが、繰り返しの条件から、抜ける直前の回ではi ≤ p i \le p i ≤ p かつj ≤ q j \le q j ≤ q であり、増えるのは一方だけです。したがって抜けた時点でもう一方の列には少なくとも一つの要素が残っており、その要素は手順 3 で加えられます。すなわち手順 2 でz z z へ加えられた要素はp + q − 1 p + q - 1 p + q − 1 個以下であり、比較の回数もp + q − 1 p + q - 1 p + q − 1 以下です。▨
併合を使って、整列の手続きを再帰的に定めます。
定義 2.4 (併合による整列). 列L L L を入力とする次の手続きを併合による整列 という。L L L の長さをn n n とする。
n ≤ 1 n \le 1 n ≤ 1 ならばL L L をそのまま出力する。
n ≥ 2 n \ge 2 n ≥ 2 ならば、L L L を先頭から⌈ n / 2 ⌉ \lceil n/2 \rceil ⌈ n /2 ⌉ 個の列L 1 L_1 L 1 と、残りの⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊ n /2 ⌋ 個の列L 2 L_2 L 2 に分ける。L 1 L_1 L 1 とL 2 L_2 L 2 のそれぞれへこの手続きを適用して整列した列を得る。
得られた二つの整列済みの列を併合し、その結果を出力する。
定理 2.5 (併合による整列の正当性と停止性). 定義 2.4 の手続きは、どの入力に対しても停止し、入力の要素を昇順に並べ替えた列を出力する。
証明. 入力の長さn n n についての累積帰納法(§D2.1 命題 1.2 )で示します。
n ≤ 1 n \le 1 n ≤ 1 のとき、長さ0 0 0 または1 1 1 の列は昇順に並んでいるので、手順 1 の出力は正しく、繰り返しも再帰も行わないので停止します。
n ≥ 2 n \ge 2 n ≥ 2 とし、長さがn n n より小さいどの入力についても主張が成り立つと仮定します。⌈ n / 2 ⌉ \lceil n/2 \rceil ⌈ n /2 ⌉ と⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊ n /2 ⌋ はどちらも1 1 1 以上n − 1 n-1 n − 1 以下なので、L 1 L_1 L 1 とL 2 L_2 L 2 への再帰は帰納法の仮定の範囲にあり、いずれも停止して、L 1 L_1 L 1 とL 2 L_2 L 2 の要素を昇順に並べた列を返します。補題 2.3 により併合も停止するので、手続き全体が停止します。補題 2.2 により、出力は二つの列の要素をちょうど一度ずつ含む昇順の列です。L 1 L_1 L 1 とL 2 L_2 L 2 の要素をあわせたものはL L L の要素にほかならないので、出力はL L L の要素を昇順に並べ替えた列です。▨
停止することの根拠は、再帰の呼び出しごとに入力の長さが真に小さくなることです。長さは非負整数なので、真に小さくなり続けることはできません。これは、長さの比較が整礎な関係であることを用いた議論であり、§D2.1 定理 2.3 の形をしています。
比較の回数は、分割から生じる漸化式によって評価します。
命題 2.6 (併合による整列の比較回数). 長さn ≥ 1 n \ge 1 n ≥ 1 の入力に対して定義 2.4 が行う比較の回数の最大値をC ( n ) C(n) C ( n ) とすると
C ( n ) ≤ n ⌈ log 2 n ⌉ C(n) \le n \lceil \log_2 n \rceil C ( n ) ≤ n ⌈ log 2 n ⌉ が成り立つ。
証明. 定義 2.4 の構造と補題 2.3 から、C ( 1 ) = 0 C(1) = 0 C ( 1 ) = 0 であり、n ≥ 2 n \ge 2 n ≥ 2 について
C ( n ) ≤ C ( ⌈ n / 2 ⌉ ) + C ( ⌊ n / 2 ⌋ ) + n − 1 C(n) \le C(\lceil n/2 \rceil) + C(\lfloor n/2 \rfloor) + n - 1 C ( n ) ≤ C (⌈ n /2 ⌉) + C (⌊ n /2 ⌋) + n − 1 が成り立ちます。この不等式のもとで主張をn n n についての累積帰納法で示します。
n = 1 n = 1 n = 1 のときはC ( 1 ) = 0 = 1 ⋅ ⌈ log 2 1 ⌉ C(1) = 0 = 1 \cdot \lceil \log_2 1 \rceil C ( 1 ) = 0 = 1 ⋅ ⌈ log 2 1 ⌉ です。
n ≥ 2 n \ge 2 n ≥ 2 とし、n n n より小さいすべての正の整数について主張が成り立つと仮定します。k = ⌈ log 2 n ⌉ k = \lceil \log_2 n \rceil k = ⌈ log 2 n ⌉ とおくと、n ≥ 2 n \ge 2 n ≥ 2 よりk ≥ 1 k \ge 1 k ≥ 1 であり、n ≤ 2 k n \le 2^{k} n ≤ 2 k です。よって⌈ n / 2 ⌉ ≤ 2 k − 1 \lceil n/2 \rceil \le 2^{k-1} ⌈ n /2 ⌉ ≤ 2 k − 1 であり、⌊ n / 2 ⌋ ≤ ⌈ n / 2 ⌉ ≤ 2 k − 1 \lfloor n/2 \rfloor \le \lceil n/2 \rceil \le 2^{k-1} ⌊ n /2 ⌋ ≤ ⌈ n /2 ⌉ ≤ 2 k − 1 なので、どちらについても⌈ log 2 ( ⋅ ) ⌉ ≤ k − 1 \lceil \log_2 (\cdot) \rceil \le k - 1 ⌈ log 2 ( ⋅ )⌉ ≤ k − 1 です。また⌈ n / 2 ⌉ \lceil n/2 \rceil ⌈ n /2 ⌉ と⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊ n /2 ⌋ はどちらも1 1 1 以上n − 1 n-1 n − 1 以下なので、帰納法の仮定を適用することができ、
C ( n ) ≤ ⌈ n / 2 ⌉ ( k − 1 ) + ⌊ n / 2 ⌋ ( k − 1 ) + n − 1 = n ( k − 1 ) + n − 1 = n k − 1 < n ⌈ log 2 n ⌉ C(n) \le \lceil n/2 \rceil (k-1) + \lfloor n/2 \rfloor (k-1) + n - 1 = n(k-1) + n - 1 = nk - 1 < n \lceil \log_2 n \rceil C ( n ) ≤ ⌈ n /2 ⌉ ( k − 1 ) + ⌊ n /2 ⌋ ( k − 1 ) + n − 1 = n ( k − 1 ) + n − 1 = nk − 1 < n ⌈ log 2 n ⌉ が得られます。▨
比較以外の操作も含めた手数は、分割統治の漸化式から求めることができます。長さn n n の列を二つに分ける操作と併合の操作はいずれもΘ ( n ) \Theta(n) Θ ( n ) の手数で行うことができるので、全体の手数T ( n ) T(n) T ( n ) はT ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T ( n ) = 2 T ( n /2 ) + Θ ( n ) を満たします。マスター定理(§D2.8 定理 3.1 )の場合 2 によりT ( n ) = Θ ( n log n ) T(n) = \Theta(n \log n) T ( n ) = Θ ( n log n ) です。
3 分割による整列
分割による整列は、順序を先に決めてから並べます。すなわち、要素を一つ選んでそれより小さい要素と大きい要素に分け、それぞれを整列してから、間に選んだ要素を挟んで並べます。併合による整列とは、手間をかける場所が逆になっています。
定義 3.1 (分割による整列). 列L L L を入力とする次の手続きを分割による整列 という。L L L の長さをn n n とする。
n ≤ 1 n \le 1 n ≤ 1 ならばL L L をそのまま出力する。
n ≥ 2 n \ge 2 n ≥ 2 ならば、L L L の先頭の要素a a a を軸 とする。残りのn − 1 n-1 n − 1 個の要素をそれぞれa a a と一度ずつ比較し、a a a より小さい要素を集めた列L < L_{<} L < と、a a a より大きい要素を集めた列L > L_{>} L > に分ける。
L < L_{<} L < とL > L_{>} L > のそれぞれへこの手続きを適用して整列し、得られた二つの列のあいだにa a a を置いて並べた列を出力する。
定理 3.2 (分割による整列の正当性と停止性). 定義 3.1 の手続きは、どの入力に対しても停止し、入力の要素を昇順に並べ替えた列を出力する。
証明. 入力の長さn n n についての累積帰納法で示します。n ≤ 1 n \le 1 n ≤ 1 のときは定理 2.5 の証明と同じです。
n ≥ 2 n \ge 2 n ≥ 2 とし、長さがn n n より小さいどの入力についても主張が成り立つと仮定します。入力の要素は相異なるので、a a a 以外のn − 1 n-1 n − 1 個の要素はそれぞれL < L_{<} L < とL > L_{>} L > のちょうど一方に入り、∣ L < ∣ + ∣ L > ∣ = n − 1 |L_{<}| + |L_{>}| = n-1 ∣ L < ∣ + ∣ L > ∣ = n − 1 です。したがって∣ L < ∣ |L_{<}| ∣ L < ∣ と∣ L > ∣ |L_{>}| ∣ L > ∣ はどちらもn − 1 n-1 n − 1 以下、すなわちn n n より小さいので、帰納法の仮定を適用することができ、二つの再帰はいずれも停止して、それぞれの要素を昇順に並べた列を返します。手順 3 は繰り返しを含まないので、手続き全体が停止します。
出力が昇順であることを確かめます。L < L_{<} L < を整列した列のどの要素もa a a より小さく、L > L_{>} L > を整列した列のどの要素もa a a より大きいので、三つをこの順に並べた列は昇順です。また出力はL < L_{<} L < の要素、a a a 、L > L_{>} L > の要素をちょうど一度ずつ含み、これはL L L の要素の全体にほかなりません。▨
比較の回数は、軸によってどのように分かれるかで大きく変わります。
命題 3.3 (分割による整列の比較回数). 長さn ≥ 1 n \ge 1 n ≥ 1 の入力に対して定義 3.1 が行う比較の回数について、次が成り立つ。
比較の回数は、どの入力に対してもn ( n − 1 ) 2 \dfrac{n(n-1)}{2} 2 n ( n − 1 ) 以下である。
すでに昇順に並んでいる入力に対する比較の回数は、ちょうどn ( n − 1 ) 2 \dfrac{n(n-1)}{2} 2 n ( n − 1 ) である。
どの再帰の段階でもL < L_{<} L < とL > L_{>} L > の長さの差が1 1 1 以下であるとき、手数T ( n ) T(n) T ( n ) はT ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T ( n ) = 2 T ( n /2 ) + Θ ( n ) を満たし、T ( n ) = Θ ( n log n ) T(n) = \Theta(n \log n) T ( n ) = Θ ( n log n ) である。
証明. 1 を示します。 比較の回数の最大値をW ( n ) W(n) W ( n ) とすると、W ( 1 ) = W ( 0 ) = 0 W(1) = W(0) = 0 W ( 1 ) = W ( 0 ) = 0 であり、n ≥ 2 n \ge 2 n ≥ 2 について、手順 2 がn − 1 n-1 n − 1 回の比較を行い、∣ L < ∣ + ∣ L > ∣ = n − 1 |L_{<}| + |L_{>}| = n-1 ∣ L < ∣ + ∣ L > ∣ = n − 1 であることから
W ( n ) ≤ max 0 ≤ s ≤ n − 1 ( W ( s ) + W ( n − 1 − s ) ) + n − 1 W(n) \le \max_{0 \le s \le n-1} \bigl( W(s) + W(n-1-s) \bigr) + n - 1 W ( n ) ≤ 0 ≤ s ≤ n − 1 max ( W ( s ) + W ( n − 1 − s ) ) + n − 1 が成り立ちます。W ( n ) ≤ n ( n − 1 ) / 2 W(n) \le n(n-1)/2 W ( n ) ≤ n ( n − 1 ) /2 をn n n についての累積帰納法で示します。n ≤ 1 n \le 1 n ≤ 1 では両辺が0 0 0 です。n ≥ 2 n \ge 2 n ≥ 2 とし、n n n より小さいすべての場合に主張が成り立つとすると、0 ≤ s ≤ n − 1 0 \le s \le n-1 0 ≤ s ≤ n − 1 に対して
W ( s ) + W ( n − 1 − s ) ≤ s ( s − 1 ) 2 + ( n − 1 − s ) ( n − 2 − s ) 2 W(s) + W(n-1-s) \le \frac{s(s-1)}{2} + \frac{(n-1-s)(n-2-s)}{2} W ( s ) + W ( n − 1 − s ) ≤ 2 s ( s − 1 ) + 2 ( n − 1 − s ) ( n − 2 − s ) です。右辺を展開して整理すると、s s s の関数として
s ( s − 1 ) 2 + ( n − 1 − s ) ( n − 2 − s ) 2 = s 2 − ( n − 1 ) s + ( n − 1 ) ( n − 2 ) 2 \frac{s(s-1)}{2} + \frac{(n-1-s)(n-2-s)}{2} = s^{2} - (n-1)s + \frac{(n-1)(n-2)}{2} 2 s ( s − 1 ) + 2 ( n − 1 − s ) ( n − 2 − s ) = s 2 − ( n − 1 ) s + 2 ( n − 1 ) ( n − 2 ) となります。s 2 − ( n − 1 ) s = s ( s − ( n − 1 ) ) s^{2} - (n-1)s = s\bigl(s - (n-1)\bigr) s 2 − ( n − 1 ) s = s ( s − ( n − 1 ) ) は0 ≤ s ≤ n − 1 0 \le s \le n-1 0 ≤ s ≤ n − 1 の範囲で0 0 0 以下であり、端点s = 0 s = 0 s = 0 とs = n − 1 s = n-1 s = n − 1 で最大値0 0 0 をとります。したがって右辺の最大値は( n − 1 ) ( n − 2 ) / 2 (n-1)(n-2)/2 ( n − 1 ) ( n − 2 ) /2 です。よって
W ( n ) ≤ ( n − 1 ) ( n − 2 ) 2 + ( n − 1 ) = ( n − 1 ) n 2 W(n) \le \frac{(n-1)(n-2)}{2} + (n-1) = \frac{(n-1)n}{2} W ( n ) ≤ 2 ( n − 1 ) ( n − 2 ) + ( n − 1 ) = 2 ( n − 1 ) n となります。
2 を示します。 入力がすでに昇順であるとき、先頭の要素は最小なのでL < L_{<} L < は空、L > L_{>} L > は残りのn − 1 n-1 n − 1 個からなり、しかも昇順のままです。したがって比較の回数をR ( n ) R(n) R ( n ) とするとR ( 1 ) = 0 R(1) = 0 R ( 1 ) = 0 かつR ( n ) = R ( n − 1 ) + ( n − 1 ) R(n) = R(n-1) + (n-1) R ( n ) = R ( n − 1 ) + ( n − 1 ) です。R ( n ) = n ( n − 1 ) / 2 R(n) = n(n-1)/2 R ( n ) = n ( n − 1 ) /2 がn n n についての単純帰納法で従います。実際、R ( 1 ) = 0 = 1 ⋅ 0 / 2 R(1) = 0 = 1 \cdot 0 / 2 R ( 1 ) = 0 = 1 ⋅ 0/2 であり、R ( n ) = ( n − 1 ) ( n − 2 ) / 2 + ( n − 1 ) = n ( n − 1 ) / 2 R(n) = (n-1)(n-2)/2 + (n-1) = n(n-1)/2 R ( n ) = ( n − 1 ) ( n − 2 ) /2 + ( n − 1 ) = n ( n − 1 ) /2 です。
3 を示します。 分割の操作はn − 1 n-1 n − 1 回の比較と、それに伴うΘ ( n ) \Theta(n) Θ ( n ) の手数で行うことができ、仮定から二つの部分列の長さはどちらもn / 2 n/2 n /2 と定数の差しかありません。よってT ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T ( n ) = 2 T ( n /2 ) + Θ ( n ) が成り立ち、マスター定理(§D2.8 定理 3.1 )の場合 2 によりT ( n ) = Θ ( n log n ) T(n) = \Theta(n \log n) T ( n ) = Θ ( n log n ) です。▨
4 比較に基づく整列の下界
ここからは、一つの手続きではなく、手続きの集まり全体についての主張を扱います。そのためには、どの範囲の手続きを考えるのかを先に定めなければなりません。
定義 4.1 (比較に基づく整列). 整列の手続きが比較に基づく とは、入力の要素に対して行う操作が、二つの要素を取り出してどちらが小さいかを問う比較だけであり、次にどの比較を行うか、いつ停止するか、および停止したときにどの並べ替えを出力するかが、それまでに行った比較の結果の列だけによって定まることをいう。
この定義は、要素の値そのものを位置や添字の計算に用いる手続きを除いている。以下では、要素の個数n n n を固定し、手続きは相異なるn n n 個の要素からなるどの入力に対しても有限回の比較で停止するものとする。
比較に基づく手続きでは、入力の要素の大小関係が同じであれば、行われる比較の結果も同じになります。相異なるn n n 個の要素の大小関係は、[ n ] [n] [ n ] の置換π \pi π によってa π ( 1 ) < ⋯ < a π ( n ) a_{\pi(1)} < \cdots < a_{\pi(n)} a π ( 1 ) < ⋯ < a π ( n ) という形で表されるので、比較の結果の列はπ \pi π だけで定まります。
定義 4.2 (決定木). 比較に基づく整列の手続きA \mathcal{A} A と要素の個数n n n を固定する。[ n ] [n] [ n ] の置換π \pi π に対し、A \mathcal{A} A がπ \pi π で表される大小関係をもつ入力に対して行う比較の結果を、行った順に並べた0 0 0 と1 1 1 の列をr ( π ) r(\pi) r ( π ) と書く。r ( π ) r(\pi) r ( π ) の接頭辞の全体を、π \pi π が[ n ] [n] [ n ] の置換すべてを動くときに集めた集合をT T T とする。T T T の要素を節点、空列を根とし、列s s s の子をs 0 s0 s 0 とs 1 s1 s 1 のうちT T T に属するものと定めると、T T T は根つき二分木になる。この木をA \mathcal{A} A の決定木 という。子をもたない節点を葉 、根から節点へ至る辺の本数をその節点の深さ 、深さの最大値を木の高さ という。
決定木の高さは、A \mathcal{A} A が相異なるn n n 個の要素からなる入力に対して行う比較の回数の最大値に等しくなります。したがって、比較の回数の下界は、決定木の高さの下界として得られます。証明は二段に分かれます。葉の個数が下から抑えられることと、高さが低い二分木には葉が少ないことです。
補題 4.3 (葉の個数の下界). 定義 4.2 の決定木は、少なくともn ! n! n ! 個の葉をもつ。
証明. まず、相異なる置換π ≠ π ′ \pi \ne \pi' π = π ′ に対してr ( π ) ≠ r ( π ′ ) r(\pi) \ne r(\pi') r ( π ) = r ( π ′ ) であることを示します。r ( π ) = r ( π ′ ) r(\pi) = r(\pi') r ( π ) = r ( π ′ ) と仮定すると、A \mathcal{A} A の動作は比較の結果の列だけで定まるので、A \mathcal{A} A は二つの入力に対して同じ並べ替えを出力します。しかしA \mathcal{A} A は正しい整列の手続きなので、大小関係がπ \pi π で表される入力に対する正しい出力はπ \pi π による並べ替えに限られ(定義 1.1 )、π ′ \pi' π ′ についても同様です。π ≠ π ′ \pi \ne \pi' π = π ′ なので二つの出力は異なり、矛盾します。
次に、各r ( π ) r(\pi) r ( π ) が決定木の葉であることを示します。r ( π ) r(\pi) r ( π ) が子をもつとすると、r ( π ) 0 r(\pi)0 r ( π ) 0 またはr ( π ) 1 r(\pi)1 r ( π ) 1 がT T T に属し、それはあるπ ′ \pi' π ′ についてr ( π ′ ) r(\pi') r ( π ′ ) の接頭辞です。すなわちr ( π ) r(\pi) r ( π ) はr ( π ′ ) r(\pi') r ( π ′ ) の真の接頭辞です。ところが定義 4.1 により、手続きが停止するかどうかはそれまでの比較の結果の列だけで定まります。π \pi π に対しては比較の結果の列がr ( π ) r(\pi) r ( π ) になった時点で停止するので、π ′ \pi' π ′ に対しても、比較の結果の列がr ( π ) r(\pi) r ( π ) に一致した時点で停止し、r ( π ′ ) = r ( π ) r(\pi') = r(\pi) r ( π ′ ) = r ( π ) となります。これはr ( π ) r(\pi) r ( π ) がr ( π ′ ) r(\pi') r ( π ′ ) の真の接頭辞であることに反します。よってr ( π ) r(\pi) r ( π ) は葉です。
以上より、[ n ] [n] [ n ] のn ! n! n ! 個の置換に対するr ( π ) r(\pi) r ( π ) は互いに相異なる葉を与えるので、葉の個数はn ! n! n ! 以上です。▨
補題 4.4 (二分木の葉の個数の上界). 高さがh h h である根つき二分木の葉の個数は2 h 2^{h} 2 h 以下である。
証明. h h h についての単純帰納法(§A3.10 定理 1.1 )で示します。
h = 0 h = 0 h = 0 のとき、木は根だけからなり、根は子をもたないので葉です。葉の個数は1 = 2 0 1 = 2^{0} 1 = 2 0 です。
h ≥ 1 h \ge 1 h ≥ 1 とし、高さがh − 1 h-1 h − 1 以下の二分木について主張が成り立つと仮定します。高さh h h の二分木T T T をとります。h ≥ 1 h \ge 1 h ≥ 1 なので根は少なくとも一つの子をもち、根自身は葉ではありません。根の子は高々二つで、各子を根とする部分木の高さはh − 1 h-1 h − 1 以下です。T T T の葉は、これらの部分木の葉をすべて集めたものに一致します。帰納法の仮定により各部分木の葉は2 h − 1 2^{h-1} 2 h − 1 個以下なので、T T T の葉は2 ⋅ 2 h − 1 = 2 h 2 \cdot 2^{h-1} = 2^{h} 2 ⋅ 2 h − 1 = 2 h 個以下です。▨
定理 4.5 (比較に基づく整列の下界). 比較に基づく整列の手続きが、相異なるn n n 個の要素からなる入力に対して行う比較の回数の最大値をh h h とすると
h ≥ ⌈ log 2 ( n ! ) ⌉ h \ge \lceil \log_2 (n!) \rceil h ≥ ⌈ log 2 ( n !)⌉ が成り立つ。
証明. 決定木の高さはh h h です。補題 4.3 により葉の個数はn ! n! n ! 以上であり、補題 4.4 により葉の個数は2 h 2^{h} 2 h 以下です。よってn ! ≤ 2 h n! \le 2^{h} n ! ≤ 2 h 、すなわちlog 2 ( n ! ) ≤ h \log_2 (n!) \le h log 2 ( n !) ≤ h です。h h h は整数なので、log 2 ( n ! ) \log_2 (n!) log 2 ( n !) 以上の整数のうち最小のもの、すなわち⌈ log 2 ( n ! ) ⌉ \lceil \log_2 (n!) \rceil ⌈ log 2 ( n !)⌉ 以上です。▨
系 4.6 (下界の位数). 比較に基づく整列の手続きが行う比較の回数の最大値h h h は、n ≥ 1 n \ge 1 n ≥ 1 についてh ≥ n 2 log 2 n h \ge \dfrac{n}{2} \log_2 n h ≥ 2 n log 2 n を満たす。とくにh = Ω ( n log n ) h = \Omega(n \log n) h = Ω ( n log n ) である。
証明. n ! ≥ n n / 2 n! \ge n^{n/2} n ! ≥ n n /2 を示します。積( n ! ) 2 = ∏ k = 1 n k ⋅ ∏ k = 1 n ( n + 1 − k ) (n!)^{2} = \prod_{k=1}^{n} k \cdot \prod_{k=1}^{n} (n+1-k) ( n ! ) 2 = ∏ k = 1 n k ⋅ ∏ k = 1 n ( n + 1 − k ) を、同じk k k の項どうしでまとめると( n ! ) 2 = ∏ k = 1 n k ( n + 1 − k ) (n!)^{2} = \prod_{k=1}^{n} k(n+1-k) ( n ! ) 2 = ∏ k = 1 n k ( n + 1 − k ) です。1 ≤ k ≤ n 1 \le k \le n 1 ≤ k ≤ n において
k ( n + 1 − k ) − n = − ( k − 1 ) ( k − n ) = ( k − 1 ) ( n − k ) ≥ 0 k(n+1-k) - n = -(k-1)(k-n) = (k-1)(n-k) \ge 0 k ( n + 1 − k ) − n = − ( k − 1 ) ( k − n ) = ( k − 1 ) ( n − k ) ≥ 0 なのでk ( n + 1 − k ) ≥ n k(n+1-k) \ge n k ( n + 1 − k ) ≥ n です。よって( n ! ) 2 ≥ n n (n!)^{2} \ge n^{n} ( n ! ) 2 ≥ n n 、すなわちn ! ≥ n n / 2 n! \ge n^{n/2} n ! ≥ n n /2 です。両辺のlog 2 \log_2 log 2 をとるとlog 2 ( n ! ) ≥ n 2 log 2 n \log_2 (n!) \ge \frac{n}{2}\log_2 n log 2 ( n !) ≥ 2 n log 2 n であり、定理 4.5 とあわせてh ≥ n 2 log 2 n h \ge \frac{n}{2}\log_2 n h ≥ 2 n log 2 n が得られます。▨
例 4.7 (小さいn n n での下界と、実際に必要な比較回数). n = 3 n = 3 n = 3 のとき3 ! = 6 3! = 6 3 ! = 6 で2 2 = 4 < 6 ≤ 8 = 2 3 2^{2} = 4 < 6 \le 8 = 2^{3} 2 2 = 4 < 6 ≤ 8 = 2 3 なので、下界は⌈ log 2 6 ⌉ = 3 \lceil \log_2 6 \rceil = 3 ⌈ log 2 6 ⌉ = 3 である。実際に3 3 3 回で足りる。a 1 a_1 a 1 とa 2 a_2 a 2 を比較して小さいほうをu u u 、大きいほうをv v v とし、a 3 a_3 a 3 をv v v と比較する。a 3 > v a_3 > v a 3 > v ならばu < v < a 3 u < v < a_3 u < v < a 3 で終わり、そうでなければa 3 a_3 a 3 をu u u と比較して、a 3 a_3 a 3 がu u u より小さいか、u u u とv v v のあいだにあるかを決める。最悪でも3 3 3 回である。
n = 4 n = 4 n = 4 のとき4 ! = 24 4! = 24 4 ! = 24 で2 4 = 16 < 24 ≤ 32 = 2 5 2^{4} = 16 < 24 \le 32 = 2^{5} 2 4 = 16 < 24 ≤ 32 = 2 5 なので、下界は5 5 5 である。併合による整列は、長さ2 2 2 の列二つへ分けて各々に1 1 1 回、併合に補題 2.3 より3 3 3 回以下なので、合計5 5 5 回以下で整列する。下界と一致するので、n = 4 n = 4 n = 4 では併合による整列は比較の回数の意味で最良である。
一方命題 2.6 が与える上界は4 ⌈ log 2 4 ⌉ = 8 4 \lceil \log_2 4 \rceil = 8 4 ⌈ log 2 4 ⌉ = 8 であり、実際の5 5 5 より大きい。上界は、正しいことが保証された評価であって、最良の評価とは限らない。
5 つまずいたら
三つの主張を混同しない。 出力が正しいこと、必ず停止すること、比較の回数の三つは別々の主張です。補題 2.2 は正しさだけを、補題 2.3 は停止することと回数だけを述べています。
ループ不変量は、繰り返しの直前で保たれるものを選ぶ。 補題 2.2 の不変量 3 を落とすと、出力が昇順であることを示すことができません。逆に、繰り返しのたびに保つことができない条件を不変量に選ぶと、帰納段階が通りません。
上界と下界を取り違えない。 命題 2.6 は一つの手続きについての上界であり、定理 4.5 は範囲を定めた手続きの全体についての下界です。前者を改良しても後者は動かず、後者を示しても前者が最良であるとは限りません(例 4.7 )。
下界の前提を落とさない。 ⌈ log 2 ( n ! ) ⌉ \lceil \log_2 (n!) \rceil ⌈ log 2 ( n !)⌉ という下界は、要素どうしの比較の結果だけで動作が定まる手続きについての主張です(注意 4.9 )。この限定を落とすと、主張は偽になります。
最悪の場合と典型的な場合を区別する。 命題 3.3 の 2 と 3 は、同じ手続きが入力によってΘ ( n 2 ) \Theta(n^{2}) Θ ( n 2 ) にもΘ ( n log n ) \Theta(n \log n) Θ ( n log n ) にもなることを示しています。どちらを述べているかを、主張のたびに明示します。