【ぶんかつとうちほう】

分割統治法 とは?

最終更新:
💡 大きな問題を「分けて解いて合わせる」

大きな問題を小さな部分問題へ分け、各部分を解いて結果を組み合わせるアルゴリズムの設計手法。必要に応じて同じ手順を繰り返し、直接解ける大きさになったら分割を止める。

📌 このページのポイント
分割統治:マージソートの例4, 1, 3, 2分ける4, 13, 24132解く1, 42, 3合わせる1, 2, 3, 4
数列を小さく分け、1要素になったら分割を止めます。整列済みの部分を小さい値から合わせる例で、矢印は処理の順序です。
ひよこ ひよこ
具体例で教えて?
ペンギン先生 ペンギン先生
マージソートを考えよう。[4, 1, 3, 2]を[4, 1]と[3, 2]に分け、さらに1要素ずつにする。1要素はそのままで並んでいるので、まず[1, 4]と[2, 3]を作り、次に小さい値から合わせて[1, 2, 3, 4]にするんだ。
ひよこ ひよこ
いつまで分ければいいの?
ペンギン先生 ペンギン先生
それ以上分けなくても直接答えが出る条件を決めるよ。マージソートなら0個や1個の要素は、すでに並んでいる。こうした終了条件が再帰の土台。分割しても問題が小さくならない作りでは、いつまでも処理が終わらないことがあるんだ。
ひよこ ひよこ
分ければ、必ず速くなる?
ペンギン先生 ペンギン先生
必ずではないよ。分割や統合にも仕事があり、部分問題の数や大きさも重要。マージソートは、各段階で全体の要素数に比例する仕事をし、半分ずつ分ける段階が対数的に増えるので、一般的な実装の時間計算量はO(n log n)になる。すべての分割統治法がこの計算量になるわけではないよ。
ひよこ ひよこ
クイックソートも同じ仕組み?
ペンギン先生 ペンギン先生
分割統治の例だけれど、分け方が違うよ。基準の値を使って要素を左右に分け、それぞれを並べ替える。平均ではO(n log n)の時間で処理できる一方、分割が偏ると最悪でO(n²)になる。分け方が性能に影響する例として覚えるとよいね。
ひよこ ひよこ
別々に解くなら、同時に実行できる?
ペンギン先生 ペンギン先生
部分問題が互いの処理に依存せず、実行環境も対応していれば、並列に解く設計ができるよ。ただし実行を分ける費用や結果を合わせる費用もある。小さすぎる問題まで分ければ速くなるとは限らない。分割・解決・統合の仕事を全体で見ることが大切なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「分割統治法」って出てきたら「問題を小さく分けて解き、結果を組み合わせる手法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Divide and Conquer」 = 分けて解決する
💬 大きな問題を分け、部分問題の答えから元の問題の答えを作る考え方だよ。

参考資料

← 用語集にもどる