整列の基本
algorithmfoundationundergraduatelecture
data/lecture/information/algorithm/foundation/recursion-basics.lecture.n.md
1導入
この講義では、整列の仕様と評価基準を定義し、挿入整列と併合整列の正当性および計算量を説明する。整列済みの配列は、後続する二分探索の前提となる。
2整列の仕様
要素列 A=(a_0,\ldots,a_{n-1}) と、要素の鍵を全順序集合へ対応させる関数 k を考える。昇順整列は、出力列 B=(b_0,\ldots,b_{n-1}) が次の二条件を満たす算法である。
- B は A の置換である。すなわち、各要素の個数が保存される。
- k(b_0)\leq k(b_1)\leq\cdots\leq k(b_{n-1}) が成立する。
第一条件は要素の欠落や重複生成を禁止し、第二条件は出力順序を規定する。
3評価基準
3.1安定性
安定な整列は、i<j かつ k(a_i)=k(a_j) である二要素の相対順序を出力でも保存する。複数の鍵で段階的に整列する場合、この性質によって先の整列結果を維持できる。
3.2原位置性
入力長 n に比例する別配列を使用せず、追加領域 O(1) で入力配列内を更新する整列を原位置整列という。再帰呼出しの記憶領域を含めるかは解析で明示する。
3.3比較モデル
比較整列では、鍵に関する情報を k(x)\leq k(y) などの比較結果からだけ取得する。以下では一回の比較と代入を O(1) とし、最悪時の時間計算量を評価する。
4挿入整列
挿入整列は、i=1,2,\ldots,n-1 の順に a_i を取り出し、整列済みの接頭辞 A[0,i) の適切な位置へ挿入する。鍵が挿入要素より大きい要素だけを右へ移動する。
4.1正当性
反復開始時に「A[0,i) は、元の A[0,i) の要素を昇順に整列した列である」を不変条件とする。
- i=1 では、一要素の接頭辞は整列済みである。
- a_i より大きい要素を右へ移動し、その直前へ a_i を挿入すると、要素を保存したまま A[0,i+1) が昇順になる。
- i=n では接頭辞が配列全体と一致する。
したがって、挿入整列は整列の仕様を満たす。同一鍵の要素を追い越さないため安定であり、一時変数だけで実装できるため原位置である。
4.2計算量
既に整列済みなら各反復の比較回数は定数であり、時間計算量は \Theta(n) である。逆順では i 番目の挿入に i 回の移動を要するため、合計は \sum_{i=1}^{n-1}i=\Theta(n^2) となる。
5併合整列
併合整列は、列を長さが高々 1 になるまで二分し、各部分列を再帰的に整列した後、二つの整列済み列を併合する。併合では両列の先頭を比較し、小さい方を出力へ移す。
5.1正当性
併合では、「出力済みの列は昇順であり、両入力列から取り除いた要素を過不足なく含む」を不変条件とする。両先頭の小さい方は未出力要素全体の最小要素であるため、この要素を追加しても不変条件は保存される。終了時には全要素が出力される。
列長に関する帰納法を適用すると、長さ 0 または 1 の列は自明に整列済みであり、短い二列の再帰結果と正しい併合から元の列も正しく整列される。したがって算法全体が正当である。
同一鍵では左側の要素を先に出力すれば安定性を保持できる。標準的な配列実装は併合用の O(n) 領域を使用するため、原位置ではない。
5.2計算量
長さ n の併合は \Theta(n) 時間を要する。時間計算量 T(n) は
T(0)=T(1)=\Theta(1),\qquad
T(n)=T(\lfloor n/2\rfloor)+T(\lceil n/2\rceil)+\Theta(n)\quad(n\geq2)
を満たす。再帰木の高さは \lceil\log_2 n\rceil であり、同一深度にある部分列長の合計は n である。したがって各深度の併合費用は高々 O(n) であり、上界は O(n\log n) となる。また、0\leq d<\lfloor\log_2 n\rfloor の各深度では長さ 2 以上の部分列の合計長が \Theta(n) であるため、下界は \Omega(n\log n) となる。よって、T(n)=\Theta(n\log n) である。
標準的な配列実装では、再利用する併合用配列が \Theta(n)、呼出しスタックが \Theta(\log(n+1)) の領域を使用する。したがって、呼出しスタックを含む総補助空間計算量は \Theta(n) である。空列は直ちに終了する。
6比較整列の下界
互いに異なる鍵をもつ n 個の要素には n! 通りの入力順序がある。決定的比較整列の二分決定木は、これらを識別するために少なくとも n! 枚の葉を必要とし、その高さは少なくとも \lceil\log_2(n!)\rceil である。n\geq2 では n!\geq(n/2)^{n/2} であるため、\log_2(n!)=\Omega(n\log n) が成立する。したがって、任意の決定的比較整列は最悪時に \Omega(n\log n) 回の比較を要する。併合整列の \Theta(n\log n) はこの比較モデルで漸近的に最適である。
7二分探索への接続
二分探索は、A_0\leq A_1\leq\cdots\leq A_{n-1} が成立する配列を前提とする。未整列の入力に一度だけ探索するなら、整列の費用が利益を上回る場合がある。同じ配列を反復探索するなら、最初に O(n\log n) で整列し、その後の各探索を O(\log n) で実行する構成が有効となる。
data/lecture/information/algorithm/search/binary-search.lecture.n.md