貪欲法と分割統治 — 「目先の最善」はいつ正しいか
動的計画法が「全部の可能性を表に貯める」戦略なら、貪欲法は「その場の最善だけを選んで振り返らない」戦略、分割統治は「半分にして征服する」戦略です。速いぶん、使ってよい条件がある。貪欲が勝つ瞬間と壊れる瞬間の両方を動かして、アルゴリズム設計の「型」を身につけます。
1. 目先の最善を積み重ねる — 区間スケジューリング
会議室が1つ、予約希望が15件。重ならないように、できるだけ多くの予約を採用したい。これが区間スケジューリング問題です。貪欲法の方針は「ある基準で並べ、先頭から順に、今までの採用と重ならなければ採用」——問題はその基準です。
候補は3つ。「開始が早い順」「所要時間が短い順」「終了が早い順」。下のデモで戦略を切り替えて、採用できた本数を比べてください。
「終了が早い順」が最適である直感はこうです。最初に終わる区間を選んでおけば、残り時間が最大になる——つまりどんな最適解があっても、その最初の区間を「最速で終わる区間」に交換して損しない。この「最適解を貪欲の選択に交換しても悪化しない」という論法を交換論法(exchange argument)と呼び、貪欲法の正しさ証明の定番です。
2. 貪欲が壊れる瞬間 — コイン両替で反例を見る
両替問題:金額 x を最少枚数の硬貨で払う。貪欲法は「払える最大の硬貨から取る」。硬貨が {1, 5, 10, 25} なら、実はこれで常に最適です。ところが硬貨を {1, 3, 4} に変えた途端、貪欲は壊れます。金額6は貪欲だと 4+1+1 の3枚、正解は 3+3 の2枚。
3. 貪欲が正しいと言える条件
貪欲法が最適解を出すことが証明できる問題には、共通して2つの性質があります。
- 貪欲選択性(greedy choice property):局所的な最善の選択を含む最適解が必ず存在する。交換論法で示すのが典型。
- 部分構造最適性(optimal substructure):最初の選択をした後に残る部分問題の最適解が、全体の最適解の一部になっている。
2つ目はDPと共通です。つまり貪欲法は「表を作らなくても最初の1手が確定するDP」と見ることができます。ダイクストラ法(確定済み集合に最も近い頂点から確定)、クラスカル法(最も軽い辺から採用)、ハフマン符号(最も頻度の低い2記号を併合)は、いずれもこの構造を持つ有名な貪欲アルゴリズムです。
4. 分割統治 — 3つのアルゴリズム、1つの骨格
貪欲法が「選択を1つに絞る」戦略なら、分割統治(divide and conquer)は「問題を小さく割って全部解き、結合する」戦略です。マージソート・二分探索・べき乗計算(繰り返し二乗法)は一見バラバラですが、分割→統治→結合という同じ3段テンプレートに載っています。
そして計算量は、分割数 a と結合コスト O(nd) の綱引きだけでほぼ決まります。下のデモで再帰の木を層ごとに眺めながら、a と結合コストを切り替えてみてください。合計コストが O(n log n) → O(n) → O(n²) と姿を変えます。
| アルゴリズム | 分割数 a | 縮小率 b | 結合コスト | 再帰式 | 計算量 |
|---|---|---|---|---|---|
| マージソート | 2 | 2 | O(n) | T(n) = 2T(n/2) + O(n) | O(n log n) |
| 二分探索 | 1 | 2 | O(1) | T(n) = T(n/2) + O(1) | O(log n) |
| べき乗(繰り返し二乗法) | 1 | 2 | O(1) | T(n) = T(n/2) + O(1) | O(log n) |
| (参考)カラツバ乗算 | 3 | 2 | O(n) | T(n) = 3T(n/2) + O(n) | O(n1.585) |
二分探索とべき乗計算は、問題はまるで違うのに再帰式が同じなので計算量も同じになる点に注目してください。分割統治の解析では「何の問題か」より「a・b・結合コスト」だけが物を言います。カラツバ乗算のように分割数を1つ減らす工夫(4回の乗算を3回に)が指数を変える——これが分割統治設計の醍醐味です。
5. まとめ — 3つの設計方針の使い分け
- 貪欲法:最速・最省メモリ。ただし貪欲選択性の証明か反例チェックが必須。区間スケジューリングは「終了が早い順」で最適、コイン両替は硬貨系次第で崩壊。
- 動的計画法:部分構造最適性があり、選択を1つに絞れないとき。貪欲の反例が出たらこちら。
- 分割統治:問題が「独立な小問題+結合」に割れるとき。計算量はマスター定理で a・b・結合コストから即座に読める。