マージソートの高速化を試みた
6月6日の日記。
午後0時(それは正午である。)に起きた……。
きのうに続き、出かけることはなかった。
『アルゴリズムイントロダクション』の勉強が2日間 停滞していて、未だにクイックソートを始められていない。(まあ、クイックソートは以前 実装したことがあるので、たやすく習得できるとは思うけど。)(そういう問題ではない。)
夕方は なぜかかなり体がだるかった。
マージソートの高速化を試みた。
一つは、マージソートの再帰が深くなって処理対象の要素数が十分に小さく(50個程度がいいらしい。)なったとき、それ以降はマージソートの再帰を行なうのでなく挿入ソートでちょくせつソートするようにするということ。 マージソートの実行時間は,挿入ソートの実行時間はで、(要素の数)が十分に大きければ、処理時間はマージソートのほうが小さくなる(漸近的に高速である。)。
しかしマージソートは処理のオーバヘッドが大きく、が十分に小さければ挿入ソートのほうが高速だ。 そのため、複数のアルゴリズム(ここではマージソートと挿入ソート)を適当に切り替えることで全体的な実行時間が向上する。すばらしい!
もう一つはマージソートを並列化するということ。
マージソートではソート対象(リスト)を再帰的に半分ずつの小分けにしてソートを行なう。(ということで、小分けのレベルが深くなって行くとリストの要素の数は元の数から , , ,... というふうに小さくなって行く。) 小分けに対する処理はそれぞれ独立しているので、並列処理が行なえる。
以上の2つの手法を適用してみた。それで、1000万個の32ビット整数をソートするのにかかる時間を測った。
途中で挿入ソート | 並列化 | かかった時間(秒) |
---|---|---|
いいえ | いいえ | 11.0 |
はい | いいえ | 7.0 |
いいえ | はい | 3.7 |
はい | はい | 3.1 |
実験を何度も繰り返したりしたわけではないし、条件を十分に示してないのでデータとしての価値はないけど、2つの手法を組み合わせて適用することで、有効に処理が高速になることを確認できた。
マージソートを、より速いソートであるクイックソートに変えたらもっと速くなるだろうか。
夜は、前日に続いて『ファイナルファンタジー13』の配信を2時間弱?行なった。くるみ餅さんはゲームの世界に入りこんでくれるので本当にやりがいがある。
月曜日は「コード生成」の日だが、きょうは だるいこともあってできなかった……。言語理論の知識を活用するタイプの作業で、難易度が高く、かなりの気力,集中力が必要だ。来週か日曜日(日課のない日)にやりたいところ……。
人間の条件さんが私のブログがセンスがあると言ってくれた。太字にセンスを感じるらしい(笑)。センスがあるかどうかは別として、論述的な記事とかであればいざ知らず、ただの日記で太字を用いるというのは少なくとも普通ではないよね……(笑)。