Math Battle [ 0321: 0307の回答 ① ]

[ 0321: 0307の回答 ① ]


[ 大宙乗児君の回答 ]

授業再開後あれこれ他の科目の勉強も忙しくなって、つい回答が遅れました。

疾矢君さんと Skype で話し合い、評価対象のアルゴリズムを次の 3 種類に決めました。

 ▪ QuickSort
 ▪ MergeSort
 ▪ HeapSort

まず QuickSort です。Perl で書いたソースコードは以下のとおり。
大小比較が何回おこなわれたかを調べるカウントを入れました。

#!/usr/local/bin/perl

$N = 100; # 100 から 1000 まで変えて実行。

@data = (
 # 1000 個の乱数 (整数)
);

$count = 0;

quickSort(0, $N-1);
printf("Count %d\n", $count);

sub quickSort($low, $high) {
 my ($low, $high) = @_;
 my $pi;

 $count++;
 if ($low < $high) {
  $pi = partition($low, $high);
  quickSort($low, $pi-1);
  quickSort($pi+1, $high);
 }
}

sub partition ($low, $high) {
 my ($low, $high) = @_;
 my $pivot, $i, $tmp;

 $pivot = $data[$high];
 $i = ($low - 1);

 for ($j = $low; $j <= $high-1; $j++) {
  $count++;
  if ($data[j] < $pivot) {
   $i++;
   $tmp = $data[$i];
   $data[$i] = $data[$j];
   $data[$j] = $tmp;
  }
 }
 $tmp = $data[$i+1];
 $data[$i+1] = $data[$high];
 $data[$high] = $tmp;
 return($i+1);
}

データ個数を 100, 200, 300, 400, ..., 1000 にした場合の実行時間をプロットしました。
O (nlogn) と言えるかどうかわかりません。リニア (linear) でないことはわかります。
やはり、その瞬間のパソコンの状態によって実行時間が影響を受けています。
きれいなグラフにはなりませんでした。

大小比較演算のカウントについては以下のとおりです。
これはアルゴリズムをそのまま反映しますのできれいなグラフです。


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

乗児君、お疲れさま。

これでいいです。アルゴリズムのコード化も間違っていません。
大小比較演算の実行数カウントはきれいなグラフになりましたね。


[ 浅見多絵さんのコメント ]

まあ、凄い。

MergeSort や HeapSort とあわせた比較を早く見たいですね。

[ 0341: 次の記事 ]

[ 0340: 素数日プログラム ]

[ 0339: emirp 探し ]

[ 0338: 0331の解きなおし ]

[ 0337: ubuntu 20.04 へ upgrade ]

[ 0336: πの近似計算 ]

[ 0335: 0253 の振り返り ]

[ 0334: Data Camp Python ]

[ 0333: 原始ピタゴラス数をさがす ]

[ 0332: LaTex の使いかた ]

[ 0331: 青い三角形の面積 ]

[ 0330: 長方形の幅 ]

[ 0329: 三角関数の関数の最大最小 ]

[ 0328: IMO 過去問 9 ]

[ 0327: 1+2+3+...+無限 ]

[ 0326: 2分木 sort も含めた性能比較 ]

[ 0325: 最悪ケースでの sort 比較 ]

[ 0324: 0307の回答 ④ ]

[ 0323: 0307の回答 ③ ]

[ 0322: 0307の回答 ② ]

[ 0321: 0307の回答 ① ]

[ 0320: 前の記事 ]

[ トップページへ ]