質問: コンピュータサイエンスの授業をします。 初心者に、計算量のオーダーについて教えたいのですが、 [1] ソート以外の、 [2] 面白く [3] 理解が簡単な問題で、 [4] 複数の解くアルゴリズム(4つ以上)があり、 [5] [4]の計算量のオーダーがそれぞれ違う(以下の内、4つ以上を含むのが望ましい) ような問題をご存じでしたら教えて下さい。 難しい注文かとは思いますが、よろしくお願いいたします。
回答: 難しい。うん、難しいですねえ、本当に。 「並べ替え」と同列でよく題材に出されるのは「探索」だと思います。 * * ただ、並べ替えと違ってすっきりのは、事前に並べ替えておいたり、ハッシュ値を求めておくのは計算量の中には入れないのかい、という初学者にとってやや反則めいた部分があるところ。 あまり面白いとは言えず([2]に違反)、4つ以上のアルゴリズムではない([4]に違反)ので、題意にもそぐわず。 計算量のオーダーって、考え方としては大切だけどちょっと古いかなあ、と思います。 「古い」というのは、それを気にしなくちゃいけない場面が少なくなってしまったから、という意味です。 昔は、限られた領域の中で、比較演算(引き算)のコストが馬鹿にならなかったから、それを減らすことが限りある CPU リソースを有効に使う、という意味ではとても大切だった。 今は、CPU リソースがふんだんにあるので、比較演算よりも、それの準備にかかるコストの方が馬鹿にならない時代になったなあ、と。 極端なケースで言うと、あるデータを整列するときに、それを比較するための基準値は DB をアクセスすると手に入る状況。 比較用の関数を渡せるようなライブラリを備えているものが多いので、その比較用の関数の中で DB をアクセスに行っちゃう。 先に DB をアクセスしておいて、比較用の値はあらかじめ取得しておこうね、と。 # ん? DB のアクセスにコストがかかるから、計算量のオーダが大切という話にもなる? 複数のアルゴリズムがあって、題材が面白い、という意味では、オセロやチェスの最適手を求める、というのが良いかな、とは思うのですが、面白いというところに達するまでの時間がかかり過ぎるのが難点。 MIN-MAX 法の話があって、取りうる手が木構造で表現できて、αβ刈りまでいって、ようやく計算量の話になる。 でも、どこで計算を打ち切るか、って部分が大きいので、ランダウの記法で表される計算量の理解には、すんなりとはいかないかな... 「ソート以外の」という [1]に違反しているんですが、並べ替えの過程を図示するの、って、初めて見たときに面白いと思ったんですけれど、どうでしょう。 100個の配列に、1~100までの数字が入っていて、十分にシャッフルされている。 横軸に、配列のインデックス。縦軸に、その値をとってプロットすると、並べ替える前は、プロットの点が一様に散らばっているように見えます。 そのグラフを、並べ替えの過程の途中で表示させると、何ステップで、どのように並べ替えられていくのかが目で見てわかります。 端から順番に並べ替えていくと、きれいに並んでいく様子が分かるけど、完了するまでに時間(ステップ数)がかかる。 よく分からないけど、全体的にざっくりと並べ替えていく方法だと、最初は並び替えられているのかどうか、よく分からないけど、ステップが進むにつれて、ざくざくときれいに整列していく。 計算量のオーダや、各アルゴリズムの計算過程、加えて、自分がひねり出すようなロジックは得てして効率は良くない、というところが直観的に理解できるのではないかな、と、思います。