§D2.9整列と比較回数の下界

最終更新

整列は、与えられた要素の列を、大小の順に並べ替えて返す問題です。本記事では二つの手続きを扱い、どちらについても、正しい答えを返すこと、必ず停止すること、比較の回数の三つを分けて示します。この三つは別々の主張であり、一つを示しても残りの二つは従いません。

本記事の後半は、前半とは種類の異なる主張を扱います。前半で示すのは、ある一つの手続きの比較回数がどれだけ小さいかという上界です。後半で示すのは、比較だけを手がかりにするどの手続きも、これより少ない比較では整列することができないという下界です。上界は手続きを一つ作れば示すことができますが、下界は、まだ誰も作っていない手続きまで含めて主張するので、手続きの全体をひとまとめに扱う枠組みが必要になります。その枠組みが決定木です。下界がどの範囲の手続きについての主張であるかは、この枠組みの決め方で変わるので、前提を先に明示します。

以下、要素は全順序が与えられた集合から取り、入力の要素はすべて相異なるとします。

1 整列の問題と、示すべき三つのこと

定義 1.1 (整列の問題). 全順序が与えられた集合の相異なる要素からなる列a1,a2,…,ana_1, a_2, \dots, a_nを入力とする。[n][n]の置換π\piでaπ(1)<aπ(2)<⋯<aπ(n)a_{\pi(1)} < a_{\pi(2)} < \cdots < a_{\pi(n)}を満たすものを求める問題を整列という。入力の要素が相異なるとき、このπ\piはただ一つに定まる。手続きの出力は、この順に並べ替えた列aπ(1),…,aπ(n)a_{\pi(1)}, \dots, a_{\pi(n)}とする。

整列の手続きについて示すことは、次の三つです。第一は、停止したときの出力が入力の要素を並べ替えた列であり、かつ昇順に並んでいることです。第二は、どの入力に対しても有限回の操作で停止することです。第三は、操作の回数の評価です。本記事では、操作の回数を要素どうしの比較の回数で測ります。

2 併合による整列

併合による整列は、列を二つに分け、それぞれを整列してから、二つの整列済みの列を一つに併せます。最後の操作を先に定めます。

定義 2.1 (併合). 昇順に並んだ二つの列x1<x2<⋯<xpx_1 < x_2 < \cdots < x_pとy1<y2<⋯<yqy_1 < y_2 < \cdots < y_qを入力とし、次の手順を併合という。

  1. i←1i \leftarrow 1、j←1j \leftarrow 1とし、出力列zzを空の列とする。
  2. i≤pi \le pかつj≤qj \le qである間、次を繰り返す。xix_iとyjy_jを比較する。xi<yjx_i < y_jならばxix_iをzzの末尾へ加えてi←i+1i \leftarrow i+1とし、そうでなければyjy_jをzzの末尾へ加えてj←j+1j \leftarrow j+1とする。
  3. 繰り返しを抜けたのち、xi,…,xpx_i, \dots, x_pとyj,…,yqy_j, \dots, y_qのうち残っているほうを、そのままの順でzzの末尾へ加え、zzを出力する。

正しい答えを返すことは、繰り返しのたびに保たれる条件によって示します。

補題 2.2 (併合の正当性).定義 2.1の手順は、x1,…,xpx_1, \dots, x_pとy1,…,yqy_1, \dots, y_qのすべての要素をちょうど一度ずつ含む昇順の列を出力する。

証明.

主張 2.2.1. 手順 2 の各回を始める時点で、次の三つが成り立ちます。

  1. 出力列zzは昇順に並んでいます。
  2. zzの要素の全体は{x1,…,xi−1}∪{y1,…,yj−1}\{x_1, \dots, x_{i-1}\} \cup \{y_1, \dots, y_{j-1}\}に一致し、どの要素もちょうど一度ずつ現れます。
  3. zzのどの要素も、xi,…,xpx_i, \dots, x_pとyj,…,yqy_j, \dots, y_qのどの要素より小さいです。

証明. 繰り返しに入る前はi=j=1i = j = 1でzzは空なので、三つの主張はすべて空虚に成り立ちます。

一回の繰り返しを始める時点で三つの主張が成り立っているとし、xi<yjx_i < y_jの場合を考えます(そうでない場合も、xxとyyの役割を入れ替えれば同じです)。手順はxix_iをzzの末尾へ加えます。主張 2.2.1 (3)によりzzのどの要素もxix_iより小さいので、xix_iを末尾に加えた列は昇順のままであり、主張 2.2.1 (1)が保たれます。iiが11増えるので、要素の全体についての主張 2.2.1 (2)も保たれます。主張 2.2.1 (3)については、加えたxix_iがxi+1,…,xpx_{i+1}, \dots, x_pより小さいこと(入力が昇順であること)と、xi<yj<yj+1<⋯<yqx_i < y_j < y_{j+1} < \cdots < y_qであることから、xix_iは残っているどの要素より小さく、zzの他の要素についてはもとの主張 2.2.1 (3)がそのまま使えます。よって三つとも保たれます。▨

繰り返しを抜けた時点ではi>pi > pまたはj>qj > qです。i>pi > pの場合、残っているのはyj,…,yqy_j, \dots, y_qだけであり、主張 2.2.1 (3)によりこれらはzzのどの要素よりも大きく、しかも昇順に並んでいます。したがって手順 3 でこれらを末尾へ加えた列は昇順であり、主張 2.2.1 (2)とあわせて、入力の全要素をちょうど一度ずつ含みます。j>qj > qの場合も同様です。▨

補題 2.3 (併合の停止性と比較回数).定義 2.1の手順は必ず停止し、行う比較の回数はp+q−1p + q - 1以下である。

証明. 量μ=(p−i+1)+(q−j+1)\mu = (p - i + 1) + (q - j + 1)を考えます。手順 2 の各回でiiまたはjjのちょうど一方が11増えるので、μ\muはちょうど11減ります。また繰り返しの条件i≤pi \le pかつj≤qj \le qのもとでμ≥2>0\mu \ge 2 > 0です。μ\muは非負の整数で毎回真に減るので、繰り返しは有限回で終わり、手順 3 は繰り返しを含まないので、手続き全体が停止します。

比較は手順 2 の各回でちょうど一回行われるので、比較の回数は繰り返しの回数に等しく、繰り返しの回数はzzへ加えられた要素の個数に等しくなります。繰り返しを抜けた時点でi>pi > pまたはj>qj > qですが、繰り返しの条件から、抜ける直前の回ではi≤pi \le pかつj≤qj \le qであり、増えるのは一方だけです。したがって抜けた時点でもう一方の列には少なくとも一つの要素が残っており、その要素は手順 3 で加えられます。すなわち手順 2 でzzへ加えられた要素はp+q−1p + q - 1個以下であり、比較の回数もp+q−1p + q - 1以下です。▨

併合を使って、整列の手続きを再帰的に定めます。

定義 2.4 (併合による整列). 列LLを入力とする次の手続きを併合による整列という。LLの長さをnnとする。

  1. n≤1n \le 1ならばLLをそのまま出力する。
  2. n≥2n \ge 2ならば、LLを先頭から⌈n/2⌉\lceil n/2 \rceil個の列L1L_1と、残りの⌊n/2⌋\lfloor n/2 \rfloor個の列L2L_2に分ける。L1L_1とL2L_2のそれぞれへこの手続きを適用して整列した列を得る。
  3. 得られた二つの整列済みの列を併合し、その結果を出力する。

定理 2.5 (併合による整列の正当性と停止性).定義 2.4の手続きは、どの入力に対しても停止し、入力の要素を昇順に並べ替えた列を出力する。

証明. 入力の長さnnについての累積帰納法(§D2.1 命題 1.2)で示します。

n≤1n \le 1のとき、長さ00または11の列は昇順に並んでいるので、手順 1 の出力は正しく、繰り返しも再帰も行わないので停止します。

n≥2n \ge 2とし、長さがnnより小さいどの入力についても主張が成り立つと仮定します。⌈n/2⌉\lceil n/2 \rceilと⌊n/2⌋\lfloor n/2 \rfloorはどちらも11以上n−1n-1以下なので、L1L_1とL2L_2への再帰は帰納法の仮定の範囲にあり、いずれも停止して、L1L_1とL2L_2の要素を昇順に並べた列を返します。補題 2.3により併合も停止するので、手続き全体が停止します。補題 2.2により、出力は二つの列の要素をちょうど一度ずつ含む昇順の列です。L1L_1とL2L_2の要素をあわせたものはLLの要素にほかならないので、出力はLLの要素を昇順に並べ替えた列です。▨

停止することの根拠は、再帰の呼び出しごとに入力の長さが真に小さくなることです。長さは非負整数なので、真に小さくなり続けることはできません。これは、長さの比較が整礎な関係であることを用いた議論であり、§D2.1 定理 2.3の形をしています。

比較の回数は、分割から生じる漸化式によって評価します。

命題 2.6 (併合による整列の比較回数). 長さn≥1n \ge 1の入力に対して定義 2.4が行う比較の回数の最大値をC(n)C(n)とすると

C(n)≤n⌈log⁡2n⌉C(n) \le n \lceil \log_2 n \rceil

が成り立つ。

証明.定義 2.4の構造と補題 2.3から、C(1)=0C(1) = 0であり、n≥2n \ge 2について

C(n)≤C(⌈n/2⌉)+C(⌊n/2⌋)+n−1C(n) \le C(\lceil n/2 \rceil) + C(\lfloor n/2 \rfloor) + n - 1

が成り立ちます。この不等式のもとで主張をnnについての累積帰納法で示します。

n=1n = 1のときはC(1)=0=1⋅⌈log⁡21⌉C(1) = 0 = 1 \cdot \lceil \log_2 1 \rceilです。

n≥2n \ge 2とし、nnより小さいすべての正の整数について主張が成り立つと仮定します。k=⌈log⁡2n⌉k = \lceil \log_2 n \rceilとおくと、n≥2n \ge 2よりk≥1k \ge 1であり、n≤2kn \le 2^{k}です。よって⌈n/2⌉≤2k−1\lceil n/2 \rceil \le 2^{k-1}であり、⌊n/2⌋≤⌈n/2⌉≤2k−1\lfloor n/2 \rfloor \le \lceil n/2 \rceil \le 2^{k-1}なので、どちらについても⌈log⁡2(⋅)⌉≤k−1\lceil \log_2 (\cdot) \rceil \le k - 1です。また⌈n/2⌉\lceil n/2 \rceilと⌊n/2⌋\lfloor n/2 \rfloorはどちらも11以上n−1n-1以下なので、帰納法の仮定を適用することができ、

C(n)≤⌈n/2⌉(k−1)+⌊n/2⌋(k−1)+n−1=n(k−1)+n−1=nk−1<n⌈log⁡2n⌉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

が得られます。▨

比較以外の操作も含めた手数は、分割統治の漸化式から求めることができます。長さnnの列を二つに分ける操作と併合の操作はいずれもΘ(n)\Theta(n)の手数で行うことができるので、全体の手数T(n)T(n)はT(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + \Theta(n)を満たします。マスター定理(§D2.8 定理 3.1)の場合 2 によりT(n)=Θ(nlog⁡n)T(n) = \Theta(n \log n)です。

3 分割による整列

分割による整列は、順序を先に決めてから並べます。すなわち、要素を一つ選んでそれより小さい要素と大きい要素に分け、それぞれを整列してから、間に選んだ要素を挟んで並べます。併合による整列とは、手間をかける場所が逆になっています。

定義 3.1 (分割による整列). 列LLを入力とする次の手続きを分割による整列という。LLの長さをnnとする。

  1. n≤1n \le 1ならばLLをそのまま出力する。
  2. n≥2n \ge 2ならば、LLの先頭の要素aaを軸とする。残りのn−1n-1個の要素をそれぞれaaと一度ずつ比較し、aaより小さい要素を集めた列L<L_{<}と、aaより大きい要素を集めた列L>L_{>}に分ける。
  3. L<L_{<}とL>L_{>}のそれぞれへこの手続きを適用して整列し、得られた二つの列のあいだにaaを置いて並べた列を出力する。

定理 3.2 (分割による整列の正当性と停止性).定義 3.1の手続きは、どの入力に対しても停止し、入力の要素を昇順に並べ替えた列を出力する。

証明. 入力の長さnnについての累積帰納法で示します。n≤1n \le 1のときは定理 2.5の証明と同じです。

n≥2n \ge 2とし、長さがnnより小さいどの入力についても主張が成り立つと仮定します。入力の要素は相異なるので、aa以外のn−1n-1個の要素はそれぞれL<L_{<}とL>L_{>}のちょうど一方に入り、∣L<∣+∣L>∣=n−1|L_{<}| + |L_{>}| = n-1です。したがって∣L<∣|L_{<}|と∣L>∣|L_{>}|はどちらもn−1n-1以下、すなわちnnより小さいので、帰納法の仮定を適用することができ、二つの再帰はいずれも停止して、それぞれの要素を昇順に並べた列を返します。手順 3 は繰り返しを含まないので、手続き全体が停止します。

出力が昇順であることを確かめます。L<L_{<}を整列した列のどの要素もaaより小さく、L>L_{>}を整列した列のどの要素もaaより大きいので、三つをこの順に並べた列は昇順です。また出力はL<L_{<}の要素、aa、L>L_{>}の要素をちょうど一度ずつ含み、これはLLの要素の全体にほかなりません。▨

比較の回数は、軸によってどのように分かれるかで大きく変わります。

命題 3.3 (分割による整列の比較回数). 長さn≥1n \ge 1の入力に対して定義 3.1が行う比較の回数について、次が成り立つ。

  1. 比較の回数は、どの入力に対してもn(n−1)2\dfrac{n(n-1)}{2}以下である。
  2. すでに昇順に並んでいる入力に対する比較の回数は、ちょうどn(n−1)2\dfrac{n(n-1)}{2}である。
  3. どの再帰の段階でもL<L_{<}とL>L_{>}の長さの差が11以下であるとき、手数T(n)T(n)はT(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + \Theta(n)を満たし、T(n)=Θ(nlog⁡n)T(n) = \Theta(n \log n)である。

証明. 1 を示します。 比較の回数の最大値をW(n)W(n)とすると、W(1)=W(0)=0W(1) = W(0) = 0であり、n≥2n \ge 2について、手順 2 がn−1n-1回の比較を行い、∣L<∣+∣L>∣=n−1|L_{<}| + |L_{>}| = n-1であることから

W(n)≤max⁡0≤s≤n−1(W(s)+W(n−1−s))+n−1W(n) \le \max_{0 \le s \le n-1} \bigl( W(s) + W(n-1-s) \bigr) + n - 1

が成り立ちます。W(n)≤n(n−1)/2W(n) \le n(n-1)/2をnnについての累積帰納法で示します。n≤1n \le 1では両辺が00です。n≥2n \ge 2とし、nnより小さいすべての場合に主張が成り立つとすると、0≤s≤n−10 \le s \le n-1に対して

W(s)+W(n−1−s)≤s(s−1)2+(n−1−s)(n−2−s)2W(s) + W(n-1-s) \le \frac{s(s-1)}{2} + \frac{(n-1-s)(n-2-s)}{2}

です。右辺を展開して整理すると、ssの関数として

s(s−1)2+(n−1−s)(n−2−s)2=s2−(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}

となります。s2−(n−1)s=s(s−(n−1))s^{2} - (n-1)s = s\bigl(s - (n-1)\bigr)は0≤s≤n−10 \le s \le n-1の範囲で00以下であり、端点s=0s = 0とs=n−1s = n-1で最大値00をとります。したがって右辺の最大値は(n−1)(n−2)/2(n-1)(n-2)/2です。よって

W(n)≤(n−1)(n−2)2+(n−1)=(n−1)n2W(n) \le \frac{(n-1)(n-2)}{2} + (n-1) = \frac{(n-1)n}{2}

となります。

2 を示します。 入力がすでに昇順であるとき、先頭の要素は最小なのでL<L_{<}は空、L>L_{>}は残りのn−1n-1個からなり、しかも昇順のままです。したがって比較の回数をR(n)R(n)とするとR(1)=0R(1) = 0かつR(n)=R(n−1)+(n−1)R(n) = R(n-1) + (n-1)です。R(n)=n(n−1)/2R(n) = n(n-1)/2がnnについての単純帰納法で従います。実際、R(1)=0=1⋅0/2R(1) = 0 = 1 \cdot 0 / 2であり、R(n)=(n−1)(n−2)/2+(n−1)=n(n−1)/2R(n) = (n-1)(n-2)/2 + (n-1) = n(n-1)/2です。

3 を示します。 分割の操作はn−1n-1回の比較と、それに伴うΘ(n)\Theta(n)の手数で行うことができ、仮定から二つの部分列の長さはどちらもn/2n/2と定数の差しかありません。よってT(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + \Theta(n)が成り立ち、マスター定理(§D2.8 定理 3.1)の場合 2 によりT(n)=Θ(nlog⁡n)T(n) = \Theta(n \log n)です。▨

注意 3.4 (最悪の場合と、下界との関係).命題 3.3の 2 は、分割による整列の最悪の比較回数がΘ(n2)\Theta(n^{2})であることを示している。これは、後で示す下界Ω(nlog⁡n)\Omega(n \log n)と矛盾しない。下界は「どの手続きも、これより少ない比較では済まない」という主張であって、「どの手続きもこの回数で済む」という主張ではないからである。軸の選び方を変えれば最悪の場合の振る舞いは変わるが、本記事では先頭の要素を軸とする形だけを扱う。

4 比較に基づく整列の下界

ここからは、一つの手続きではなく、手続きの集まり全体についての主張を扱います。そのためには、どの範囲の手続きを考えるのかを先に定めなければなりません。

定義 4.1 (比較に基づく整列). 整列の手続きが比較に基づくとは、入力の要素に対して行う操作が、二つの要素を取り出してどちらが小さいかを問う比較だけであり、次にどの比較を行うか、いつ停止するか、および停止したときにどの並べ替えを出力するかが、それまでに行った比較の結果の列だけによって定まることをいう。

この定義は、要素の値そのものを位置や添字の計算に用いる手続きを除いている。以下では、要素の個数nnを固定し、手続きは相異なるnn個の要素からなるどの入力に対しても有限回の比較で停止するものとする。

比較に基づく手続きでは、入力の要素の大小関係が同じであれば、行われる比較の結果も同じになります。相異なるnn個の要素の大小関係は、[n][n]の置換π\piによってaπ(1)<⋯<aπ(n)a_{\pi(1)} < \cdots < a_{\pi(n)}という形で表されるので、比較の結果の列はπ\piだけで定まります。

定義 4.2 (決定木). 比較に基づく整列の手続きA\mathcal{A}と要素の個数nnを固定する。[n][n]の置換π\piに対し、A\mathcal{A}がπ\piで表される大小関係をもつ入力に対して行う比較の結果を、行った順に並べた00と11の列をr(π)r(\pi)と書く。r(π)r(\pi)の接頭辞の全体を、π\piが[n][n]の置換すべてを動くときに集めた集合をTTとする。TTの要素を節点、空列を根とし、列ssの子をs0s0とs1s1のうちTTに属するものと定めると、TTは根つき二分木になる。この木をA\mathcal{A}の決定木という。子をもたない節点を葉、根から節点へ至る辺の本数をその節点の深さ、深さの最大値を木の高さという。

決定木の高さは、A\mathcal{A}が相異なるnn個の要素からなる入力に対して行う比較の回数の最大値に等しくなります。したがって、比較の回数の下界は、決定木の高さの下界として得られます。証明は二段に分かれます。葉の個数が下から抑えられることと、高さが低い二分木には葉が少ないことです。

補題 4.3 (葉の個数の下界).定義 4.2の決定木は、少なくともn!n!個の葉をもつ。

証明. まず、相異なる置換π≠π′\pi \ne \pi'に対してr(π)≠r(π′)r(\pi) \ne r(\pi')であることを示します。r(π)=r(π′)r(\pi) = r(\pi')と仮定すると、A\mathcal{A}の動作は比較の結果の列だけで定まるので、A\mathcal{A}は二つの入力に対して同じ並べ替えを出力します。しかしA\mathcal{A}は正しい整列の手続きなので、大小関係がπ\piで表される入力に対する正しい出力はπ\piによる並べ替えに限られ(定義 1.1)、π′\pi'についても同様です。π≠π′\pi \ne \pi'なので二つの出力は異なり、矛盾します。

次に、各r(π)r(\pi)が決定木の葉であることを示します。r(π)r(\pi)が子をもつとすると、r(π)0r(\pi)0またはr(π)1r(\pi)1がTTに属し、それはあるπ′\pi'についてr(π′)r(\pi')の接頭辞です。すなわちr(π)r(\pi)はr(π′)r(\pi')の真の接頭辞です。ところが定義 4.1により、手続きが停止するかどうかはそれまでの比較の結果の列だけで定まります。π\piに対しては比較の結果の列がr(π)r(\pi)になった時点で停止するので、π′\pi'に対しても、比較の結果の列がr(π)r(\pi)に一致した時点で停止し、r(π′)=r(π)r(\pi') = r(\pi)となります。これはr(π)r(\pi)がr(π′)r(\pi')の真の接頭辞であることに反します。よってr(π)r(\pi)は葉です。

以上より、[n][n]のn!n!個の置換に対するr(π)r(\pi)は互いに相異なる葉を与えるので、葉の個数はn!n!以上です。▨

補題 4.4 (二分木の葉の個数の上界). 高さがhhである根つき二分木の葉の個数は2h2^{h}以下である。

証明.hhについての単純帰納法(§A3.10 定理 1.1)で示します。

h=0h = 0のとき、木は根だけからなり、根は子をもたないので葉です。葉の個数は1=201 = 2^{0}です。

h≥1h \ge 1とし、高さがh−1h-1以下の二分木について主張が成り立つと仮定します。高さhhの二分木TTをとります。h≥1h \ge 1なので根は少なくとも一つの子をもち、根自身は葉ではありません。根の子は高々二つで、各子を根とする部分木の高さはh−1h-1以下です。TTの葉は、これらの部分木の葉をすべて集めたものに一致します。帰納法の仮定により各部分木の葉は2h−12^{h-1}個以下なので、TTの葉は2⋅2h−1=2h2 \cdot 2^{h-1} = 2^{h}個以下です。▨

定理 4.5 (比較に基づく整列の下界). 比較に基づく整列の手続きが、相異なるnn個の要素からなる入力に対して行う比較の回数の最大値をhhとすると

h≥⌈log⁡2(n!)⌉h \ge \lceil \log_2 (n!) \rceil

が成り立つ。

証明. 決定木の高さはhhです。補題 4.3により葉の個数はn!n!以上であり、補題 4.4により葉の個数は2h2^{h}以下です。よってn!≤2hn! \le 2^{h}、すなわちlog⁡2(n!)≤h\log_2 (n!) \le hです。hhは整数なので、log⁡2(n!)\log_2 (n!)以上の整数のうち最小のもの、すなわち⌈log⁡2(n!)⌉\lceil \log_2 (n!) \rceil以上です。▨

系 4.6 (下界の位数). 比較に基づく整列の手続きが行う比較の回数の最大値hhは、n≥1n \ge 1についてh≥n2log⁡2nh \ge \dfrac{n}{2} \log_2 nを満たす。とくにh=Ω(nlog⁡n)h = \Omega(n \log n)である。

証明.n!≥nn/2n! \ge n^{n/2}を示します。積(n!)2=∏k=1nk⋅∏k=1n(n+1−k)(n!)^{2} = \prod_{k=1}^{n} k \cdot \prod_{k=1}^{n} (n+1-k)を、同じkkの項どうしでまとめると(n!)2=∏k=1nk(n+1−k)(n!)^{2} = \prod_{k=1}^{n} k(n+1-k)です。1≤k≤n1 \le k \le nにおいて

k(n+1−k)−n=−(k−1)(k−n)=(k−1)(n−k)≥0k(n+1-k) - n = -(k-1)(k-n) = (k-1)(n-k) \ge 0

なのでk(n+1−k)≥nk(n+1-k) \ge nです。よって(n!)2≥nn(n!)^{2} \ge n^{n}、すなわちn!≥nn/2n! \ge n^{n/2}です。両辺のlog⁡2\log_2をとるとlog⁡2(n!)≥n2log⁡2n\log_2 (n!) \ge \frac{n}{2}\log_2 nであり、定理 4.5とあわせてh≥n2log⁡2nh \ge \frac{n}{2}\log_2 nが得られます。▨

例 4.7 (小さいnnでの下界と、実際に必要な比較回数).n=3n = 3のとき3!=63! = 6で22=4<6≤8=232^{2} = 4 < 6 \le 8 = 2^{3}なので、下界は⌈log⁡26⌉=3\lceil \log_2 6 \rceil = 3である。実際に33回で足りる。a1a_1とa2a_2を比較して小さいほうをuu、大きいほうをvvとし、a3a_3をvvと比較する。a3>va_3 > vならばu<v<a3u < v < a_3で終わり、そうでなければa3a_3をuuと比較して、a3a_3がuuより小さいか、uuとvvのあいだにあるかを決める。最悪でも33回である。

n=4n = 4のとき4!=244! = 24で24=16<24≤32=252^{4} = 16 < 24 \le 32 = 2^{5}なので、下界は55である。併合による整列は、長さ22の列二つへ分けて各々に11回、併合に補題 2.3より33回以下なので、合計55回以下で整列する。下界と一致するので、n=4n = 4では併合による整列は比較の回数の意味で最良である。

一方命題 2.6が与える上界は4⌈log⁡24⌉=84 \lceil \log_2 4 \rceil = 8であり、実際の55より大きい。上界は、正しいことが保証された評価であって、最良の評価とは限らない。

注意 4.8 (下界が達成されるとは限らない).定理 4.5は、比較の回数が⌈log⁡2(n!)⌉\lceil \log_2 (n!) \rceil未満である手続きが存在しないことを述べているだけであり、ちょうど⌈log⁡2(n!)⌉\lceil \log_2 (n!) \rceil回で整列する手続きが存在することを述べていない。実際、比較の回数の最小値がこの下界と一致しないnnが存在することが知られている(Knuth, The Art of Computer Programming, Volume 3 の比較回数を最小にする整列の扱い)。上界と下界が一致するかどうかは、それぞれ別に調べる必要がある。

注意 4.9 (下界が主張する範囲).定理 4.5は、定義 4.1の意味で比較に基づく手続きについての主張である。要素の値そのものを位置の計算に用いる手続きは、この範囲に入らない。

たとえば、入力の要素がすべて00以上kk未満の整数であるとき、長さkkの表を用意して各値の出現回数を数え、値の小さい順に出力する手続きは、要素どうしの比較を一度も行わずに整列し、手数はΘ(n+k)\Theta(n + k)である。kkがnnの定数倍以下であればこれはΘ(n)\Theta(n)であり、Ω(nlog⁡n)\Omega(n \log n)より小さい。この手続きは値を表の添字として用いるので定義 4.1の形をしておらず、下界は破られていない。下界を引用するときは、その下界がどの範囲の手続きについての主張であるかを必ず確かめる。

参考文献

  1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, Cambridge, Massachusetts, 2022.
  2. Donald E. Knuth, The Art of Computer Programming, 2nd ed., vol. 3, Addison-Wesley, 1998.

前提記事