Math Battle [ 0307: sort アルゴリズムの性能比較 ]

[ 0307: sort アルゴリズムの性能比較 ]


[ 南門疾矢君の出題 ]

sort というのはデータを大小順に並べ直すことです。
昇順 (小さいものから大きいものへ) と降順 (大きいものから小さいものへ)
がありますが、この評価ではどちらでもいいです。

sort には昔から様々な方法が提案されており、主なものの一欄は以下のとおりです。
O(n) は実現不可能ですが、O(n*log(n)) は実用になると言えます。

このうち、2 分木ソート、マージソート、クイックソートに関して実行時間の比較
をしてください。どんな結果になるでしょう?

  • 1000 個 のテストデータ (整数で可) をあらかじめ乱数で生成し、これをそれぞれの
    アルゴリズム用の Perl プログラムに配列 (array) としてコピーして入れてください。

  • 処理時間の測定には time perl QuickSort.pl みたいに
    time コマンドを使ってください。

    time perl QuickSort.pl
    Count 5149

    real 0m0.244s
    user 0m0.009s
    sys 0m0.008s

  • アルゴリズムは GeekForGeeks サイトなどで公開されていますから、
    自分で真似してください。


[ 湯会老人のコメント ]

実際にプログラムを作って実行し処理時間を計測するとかえって本質を見失います。

Sort アルゴリズムの性能とは:
「こういう状態のデータに対して大小比較を何回やれば sort しきれるか」
ということです。

サブルーチンを含むプログラムではサブルーチンを呼び出す際に引数 (ひきすう)
を与え、サブルーチンから戻ってくる際に間違いなく戻ってくるための情報を記録します。

自分自身を呼び出す再帰的関数 (recursive function) では
これらの情報をスタック (stack) に入れる方法を取るため、
再帰的呼び出しが深くなるとスタック領域をそれだけ消費し
極端な場合は stack overflow になります。

実際に実行するとアルゴリズム以外のところで
こうした overhead (余分な処理) がありますから、 実行時間よりも:
「大小比較演算が何回おこなわれたか」をカウントしたほうがいいでしょう。


[ 南門疾矢君のコメント ]

たしかにそうですね。

ふつうアルゴリズムの性能比較は今でも擬似コード (pseudo code)
を書いて該当処理部分の「行数」を数えたりしています。
了解しました。まずは「大小比較演算のカウント方式」で進めましょう。

各アルゴリズムのサンプルコード (Perl 言語でいいでしょう) を乗児君に渡します。
あとは楽にできるでしょう。

[ 0321: 次の記事 ]

[ 0320: 単純計算問題 ]

[ 0319: 0288の変形 ② ]

[ 0318: 数学的ソウルメイトトリオ ]

[ 0317: 円の中の円とn個の正方形 ]

[ 0316: IMO 過去問: 8 ]

[ 0315: 未解決の問題 ]

[ 0314: 二等辺三角形の面積 ]

[ 0313: IMO 過去問: 7 ]

[ 0312: 正方形の中の正方形の面積 ]

[ 0311: IMO 過去問: 6 ]

[ 0310: 三角形の周計算 ]

[ 0309: 正方形4個でわかる円の半径 ]

[ 0308: 円がからむ長方形の面積 ]

[ 0307: sort アルゴリズムの性能比較 ]

[ 0306: 内接円と三角形の面積 ]

[ 0305: 三角形の中の 6 角形 ]

[ 0304: 正方形の中の正三角形と円 ]

[ 0303: 正方形の周と円の周 ]

[ 0302: 1/a + 1/b = 3/2018 ]

[ 0301: 黄金比を使ったロゴ ]

[ 0300: 前の記事 ]

[ トップページへ ]