東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

昆布じゃないのよ(そのに)

先日の combsort 、比較/交換する要素間の距離(gap)をぢわぢわ縮めていく
bubblesort の改良版なわけですが。

どのくらいずつ縮めていくか、 つまり gap = gap / ratio; における ratio は
実験的に 1.3 だという。ホントかしら? ってんでやってみた。

template<typename Iterator>
void combsort(Iterator first, Iterator last, double gap_ratio) {
  auto gap = std::distance(first,last); // 要素間の距離:最初は要素数から
  Iterator iter1, iter2;
  bool swapped;
  do {
    gap = gap / gap_ratio; // ちょびっと狭める
    if ( gap == 0 ) gap = 1;
    swapped = false;
    Iterator iter1 = first;
    Iterator iter2 = first;
    std::advance(iter2,gap); // iter1,iter2間をgapだけ離す
    while ( iter2 != last ) { // これ以降はbubblesortと同じね
      if ( *iter2 < *iter1 ) {
        swapped = true;
        std::iter_swap(iter1,iter2);
      }
      ++iter1;
      ++iter2;
    }
  } while (swapped || gap != 1);
}

void random_test() {
  const int N = 50000;
  array<int,N> source;
  array<int,N> target;
  iota(source.begin(), source.end(), 0); // [0..N) の配列を用意
  map<int,double> hist;
  const int trial = 10;
  for ( int t = 0; t < trial; ++t ) {
    random_shuffle(source.begin(), source.end()); // ぐちょぐちょにかき混ぜて
    double time;
    for ( int i = 110; i < 140; ++i ) {
      double ratio = i / 100.0;
      copy(source.begin(), source.end(), target.begin());
      {
        orz::ScopedWatch watch(time);
        combsort(target.begin(), target.end(), ratio); // 昆布ソート
      }
      if ( is_sorted(target.begin(),target.end()) ) {
        hist[i] += time; // 所要時間を積算
      } else {
        cout << "oops. disordered!" << endl;
        return;
      }
    }
  }
  // 平均値を出力
  for ( int i = 120; i < 140; ++i ) {
    cout << "ratio= " << i/100.0 << " time=" << hist[i]/trial << endl;
  }

}

結果:
ratio= 1.2  time=6.64967
ratio= 1.21 time=6.56539
ratio= 1.22 time=6.37233
ratio= 1.23 time=6.56348
ratio= 1.24 time=6.18083
ratio= 1.25 time=6.18782
ratio= 1.26 time=6.25421
ratio= 1.27 time=6.07581
ratio= 1.28 time=6.26599
ratio= 1.29 time=6.02135
ratio= 1.3  time=6.55121
ratio= 1.31 time=6.80597
ratio= 1.32 time=6.47621
ratio= 1.33 time=6.12299
ratio= 1.34 time=6.59149
ratio= 1.35 time=13.3166
ratio= 1.36 time=20.2281
ratio= 1.37 time=34.2606
ratio= 1.38 time=54.2303
ratio= 1.39 time=64.2049

ふむ、この場合に限って言えば 1.29 のときが最速。
1.33のあたりにヘコみがあるのも面白いですな。
とはいえ 1.3近傍が実験的によさげな値なのは確かなようです。

投稿日時 : 2010年12月29日 1:33

コメントを追加

# re: 昆布じゃないのよ(そのに) 2010/12/31 2:06 Chiharu

あら。最初の Iterator iter1, iter2; は不要ではないでしょうか。

# re: 昆布じゃないのよ(そのに) 2010/12/31 5:24 επιστημη

アッ

# re: 昆布じゃないのよ(そのに) 2010/12/31 19:55

g++4.5.1(D510MO/Ubuntu10.10)でちょこっと細かくして可視化しといてみました。
アルゴリズム的にも山というか振動がどんどん大きくなりますネ

# re: 昆布じゃないのよ(そのに) 2010/12/31 21:24 επιστημη

あらおもしろい。1.25超えたあたりからえらくぢたばたすんのねー

ってコメント書いたのにのっからないよっ!?

# re: 昆布じゃないのよ(そのに) 2011/01/01 15:32

はりゃりゃ、お米の件すみません;w;

ともあれ今年も楽しいネタ投下、
よよしくお願いします^-^

# re: ????????(???) 2021/08/09 13:12 hcqs side effects

where to get chloroquine https://chloroquineorigin.com/# does hydroxychloroquine cause heart problems

タイトル
名前
URL
コメント