seegongsik
アルゴリズム

分割統治 わかりやすく

山のような洗濯物を一人でたたむのは気が遠くなります。でも半分に分けて、片方を弟に任せたらどうでしょう。二人とも小さくなった山だけをたたみ、最後に合わせれば終わりです。大きな問題も同じです。半分に割って、それぞれ解いて、また合わせればよいのです。

01

半分に割る

前に、大きな仕事は小さな段階に分けると話しました。ここではもう一歩進みます。
問題のかたまりを半分に割り、その半分をまた半分に、それをまた半分に割ります。
するとかけらはどんどん小さくなります。

8
一つのかたまりです。押して半分に割ってみましょう。

半分に割るを押すたびに、かたまりが半分ずつに分かれ、かけらはどんどん小さくなります。

割るたびに、扱う量は半分になります。
大きな山には途方に暮れましたが、小さなかけら一つならずっと気楽です。
辞書を半分ずつ開いて探したときと、同じ感覚です。

02

かけらは重ならない

ここにとても大切なことがあります。半分に割った二つのかけらは、互いに重なりません。
左の山と右の山は同じ服を分け合わないので、片方でした仕事をもう片方がくり返す必要はありません。
二つは完全に別々です。

重なり
0
二つのかけらを一つずつ押して照らしてみましょう。

二つのかけらを一つずつ押して照らすと、重なる部分は一つもありません。別々(独立)なので、それぞれ解いてもぶつかりません。

重ならないというこの性質は、思った以上に大切です。
かけらが重ならないので、片方の答えがもう片方の答えを台なしにしません。
重なる問題に出会うと話は変わりますが、それはまた別の道です。

03

小さなかけらを解く

半分に割り続けると、もうそれ以上割れない、とても小さなかけらが出てきます。
服一枚、数一つのようなものです。
そこまで小さければ、悩むまでもなくすぐ解けます。

いちばん小さなかけらです。一つずつ押すと、すぐ解けます。

いちばん小さなかけら(底)を一つずつ押すと、すぐ解けます。もう割れないほど小さいので、悩まずに解けて緑に変わります。

大きな問題を一度に解こうとして苦しむことはありません。
最後まで割ってから、解きやすい小さなかけらだけを一つずつ解きます。
難しい仕事一つを、やさしい仕事いくつかに変えてしまったのです。

04

合わせて上げる

小さな答えがそろったので、今度は逆に上がっていきます。
小さな答えを二つ合わせて少し大きな答えを作り、それをまた合わせてもっと大きな答えを作ります。
割った回数だけ合わせていくと、いちばん上に全体の答えができあがります。

1
1
1
1
1
1
1
1
解いた小さなかけらが8つ。押すと二つずつ上へ合わさります。

合わせて上げるを押すたびに、解けたかけらが二つずつ一つに合わさります。いちばん上で全体の答えが完成します。

割るときは下へ、合わせるときは上へ。
かけらが重ならなかったので、合わせるときもすっきりしています。左の答えと右の答えを一つにまとめればよいのです。
これが半分に割って征服する方法、分割統治です。

05

割って、解いて、合わせる

一行にまとめるとこうなります。半分に割り、重ならないかけらをそれぞれ解き、また合わせて上げる。
カードを半分ずつに分けて並べ替えた方法はこの型そのままで、辞書を半分ずつ開いて探した方法は、探す値のない側を捨てて片方だけ解けばよい場合です。
大きなものも、割れば小さくなります。

最初の一歩から順に押して、一周たどります。

三つの歩みを順に押して、一周たどります。半分に割る → 小さなかけらを解く → 合わせて上げる。かけらが重ならないことが肝心です。

ここでは、かけらどうしがきれいに離れていたので、一度解いたかけらをもう一度解くことはありませんでした。
でも、もしかけらが重なっていて、同じものを何度も解き直さなければならないとしたら?
次のレッスンではまず、割ることを自分でくり返す再帰を見て、その分かれ道にはそのすぐあとで出会います。

一言でいうと大きな問題は、半分に割り、それぞれ解き、また合わせて征服します。肝心なのは、割った二つのかけらが互いに重ならないことです。片方でした仕事を、もう片方がやり直さなくてよいからです。もう割れないほど小さくなったらすぐ解き、解けたかけらを上へ合わせていけば全体の答えが出ます。マージソートはこの型そのままで、二分探索は片方を捨てて半分だけ解く近い親戚です。かけらが重ならないことが、このやり方の力です。
← アルゴリズム
このページがお役に立ったなら支援する