100万個を並べる手数
100万個の数を小さい順に並べ替えるには、何回くらい比べればよいだろうか。選択ソートのように全部の組を1回ずつ比べると、約5,000億回になる。でも、列を半分に分けてそれぞれを並べ、並んだ2つの列をつなぐマージソートなら、約2,000万回で済む。
分けて解き、答えをつなぐ。この分割統治の手数は、の形の漸化式で書ける。漸化式は、大きさの問題の手数を、もっと小さな問題の手数で表した式である。1980年、ジョン・ベントリー、ドロシア・ハーケン、ジェームズ・サックスは論文「分割統治の漸化式を解く一般的な方法」を『ACM SIGACT News』に発表し、この形の漸化式をまとめて解く方法を示した。
この方法は、いまはマスター定理、またはマスター法と呼ばれている。たとえばMITが2005年に開いたアルゴリズムの講義では、第2回の題に「マスター法」が入っている。受け持ったのはエリック・デメインと、教科書『Introduction to Algorithms』の著者の1人であるチャールズ・ライザーソンだ。
段ごとの手数を足す
図で納得する
は、大きさの問題を解く手数(回)である。は、並べ替える数の個数のような問題の大きさで、は分けてできる小さな問題の数、は小さな問題1つが元の何分の1の大きさかを表す。は、分けた答えをつなぐ手数がの乗くらいかかることを表す。
(シータ)は、だいたいの増え方を表す記号だ。は、が大きいとき、がの決まった2つの倍数、たとえば1倍と2倍の間に挟まることをいう。つまり、定数倍の違いは気にせず、を10倍にしたら手数が何倍になるかだけを見る。
分割統治の手数は、分け方を木の形に描くとつかめる。いちばん上の段に大きさの問題を置き、分けた個を1つ下の段に並べる。これを大きさ1になるまで続けると、各段の手数をすべて足したものがになる。
段ごとの手数は、、、の組み合わせによって、下の段ほど減るか、どの段も同じか、下の段ほど増えるかの3通りに分かれる。
大きさの問題をで分け、分ける数とつなぐ手数を選ぶと、段0から段5までの手数が棒で並ぶ。マージソート(、)と二分探索(、)では、どの段も同じ長さになる。カラツバ法(、)では下の段ほど長く、、では下の段ほど短い。
読み出しのは「2を何乗するとになるか」を表す数で、これをと比べると答えが決まる。
では、段の手数を全部足すと、どれくらいになるのか。段の手数は、1つ下の段へ進むたびに同じ数が掛かる等比数列で、この掛かる数を公比という。等比数列の和は、公比が1より小さければ最初の項で、1より大きければ最後の項でほぼ決まる。
式で確かめる
道すじは3段ある。段ごとの手数を足して等比数列の和にし(手順1〜4)、公比の大きさで3通りに分けて和を見積もり(手順5〜8)、最後にと1の比べ方を、との比べ方に直す(手順9〜11)。簡単のため、はの累乗で、大きさ1の問題は1回で解け、つなぐ手数はちょうど回とする。
-
段にある問題の数と、1つの大きさを書く
-
段の問題個の手数を足す
-
を前に出し、残りを乗の形にまとめる
-
段0から最後の段までを足す
ここでは段から段への公比、はをで何回割ると1になるかを表す数で、となる。このようなをと書き、「を何乗するとになるか」を表す。、ならで、木は段0から段3までの4段になる。
マージソートの(、、)で段1を計算すると、回で、木の図の段1と合う。公比はなので、どの段も回である。手数に定数を掛けても、の答えは変わらない。
-
なら、かっこの中は1以上でより小さい
-
なら、かっこの中は1が個
-
なら、かっこの中は最後の項以上で、その倍より小さい
-
最後の段の手数にを使う
手順5の両側はどちらもの定数倍なので、である。手順5と7の倍率とは、公比0.5でも公比2でも2になり、等比数列の図の「2倍」はこの数だ。
手順6のは、(底という)を替えても定数倍しか変わらないので、の中では底を書かない。手順8のは最後の段にある問題の数、つまり木の葉の数で、では葉の数が手数を決める。
累乗の対数は、指数を前に出した掛け算になる。たとえばで、これはと等しい。
-
2つの数のをとって比べる
-
対数が等しいので、元の数も等しい
-
の両辺にを掛けてからをとる
同じように、はに、はにあたる。手順5、6、10の答えが、マスター定理の3つの場合である。
ただ、ここで示したのは、つなぐ手数がの形をしているときの簡単な版である。教科書の一般の形では、つなぐ手数を任意の式で書き、がより十分速く増える場合には、()という条件を付け加える。
4つのアルゴリズムに数を入れる
二分探索、マージソート、カラツバ法、シュトラッセン法は、どれも問題を半分の大きさに分けるのでである。だから、と比べる相手はになる。
この値とを比べると、答えが決まる。表の比は、大きさ1を1回、つなぐ手数をちょうど回として(約105万)の手数を漸化式から出し、答えの式で割った値である。
| アルゴリズム | 答え | 比 | ||
|---|---|---|---|---|
| 二分探索 | 1 | 0 | 1.05 | |
| マージソート | 2 | 1 | 1.05 | |
| カラツバ法 | 3 | 1 | 3.00 | |
| シュトラッセン法 | 7 | 2 | 2.33 |
二分探索とマージソートはの場合だ。マージソートの手数は22,020,096回で、の20,971,520回より少し多いが、比は1.05にとどまる。一方、カラツバ法とシュトラッセン法はの場合で、比はでも2.97と2.33で、ほとんど変わらない。比が一定の数に落ち着くことが、で答えが合っているという意味だ。
二分探索は、小さい順に並んだ列の真ん中と比べて、探す範囲を半分ずつに絞る方法だ。カラツバ法は、2つの大きな数の掛け算を半分の長さの掛け算3回にする方法で、くわしくは整数の掛け算で読める。シュトラッセン法は、行列の積を半分の大きさの積7回にする方法で、行列の積の指数のはこの計算から出る。
比べるだけの並べ替えは、マージソートのより速くできないことが知られている。最短経路の並べ替えの壁の話は、そこから始まる。
漸化式を解く練習
例題 1基本対数の値と3つの場合
(1)、、を求めよ。(2)で、、、のときの答えをそれぞれ求めよ。
解説を見る
(1)、、なので、順に3、2、0.5である。
(2)、で、である。は、は、はの場合にあたる。
例題 2大学マージソートの手数を数える
、とする。のときを示し、を求めよ。
解説を見る
手順3で、、なので、公比はである。どの段の手数もになる。
木の段は段0から段までの段で、である。手順4から次の式になる。
なら次のとおりだ。
例題 3大学シュトラッセン法の掛け算の回数
の行列の積を、半分の大きさの積7回に分けると、掛け算の回数は、になる。(1)のときを示せ。(2)のとき、定義どおりの回と比べて何倍か。
解説を見る
(1)掛け算の回数だけを数えるので、つなぐ手数は0回で、手数は葉の数だけになる。1段下るごとに7倍で、段で回である。手順9と同じく書き直す。
(2)、である。
約0.26倍、つまり4分の1ほどになる。
例題 4大学簡単な版に入らない漸化式
、とする。のとき、再帰の木でを示し、を導け。
解説を見る
つなぐ手数はの形ではないので、簡単な版は使えない。段には大きさの問題が個あり、1つをつなぐ手数はである。
段0から段まで足す(段の葉は)。
なので、が大きいときはに近づき、である。ならで、になる。
参考文献
- 中央大学「数理情報学2」シラバス(2026年度 後期、理工学部、2年次配当。授業計画に「分割統治法1:マージソート、漸化式の解析」「分割統治法4:Strassenの行列積アルゴリズム」)
- J. L. Bentley, D. Haken, J. B. Saxe, "A general method for solving divide-and-conquer recurrences", ACM SIGACT News 12(3), 36-44 (1980), doi:10.1145/1008861.1008865
- E. D. Demaine, C. E. Leiserson, "Lecture 2: Asymptotic Notation, Recurrences, Substitution, Master Method", MIT 6.046J Introduction to Algorithms (Fall 2005), MIT OpenCourseWare。読む範囲は同講義の「Readings」(T. Cormen, C. Leiserson, R. Rivest, C. Stein, Introduction to Algorithms, 3rd ed., MIT Press, 2009の第3〜4章)
- 鹿島久嗣「アルゴリズムとデータ構造④ 分割統治法」京都大学の講義資料(2022年。つなぐ手数が問題の大きさに比例する場合の簡易版の定理と、マージソートの解析)