コンテンツにスキップ

「ボゴソート」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Ryns (会話 | 投稿記録)
テンプレートの型名が不適切だったものを修正。 InputIterではstd::shuffleの要件を満たさない。
編集の要約なし
9行目: 9行目:
|optimal=No
|optimal=No
}}
}}
'''ボゴソート''' (bogosort) は、[[ソート]]の[[アルゴリズム]]の一つ。平均的な計算時間は[[ランダウの記号|O]](n&times;n!)で、非常に効率の悪いアルゴリズムとして知られている。[[安定ソート]]ではない。「bogo」は、"bogus"<ref>http://catb.org/~esr/jargon/html/B/bogus.html</ref>に由来する。<!--ボゴソートは、「量子ボゴダイナミックス」というユーモラスな用語にちなんで名付けられている。その元は、bogus(偽の)である。--><!-- ←は? -->


英語では、random sort(ランダムソート), shotgun sort(「数撃ちゃ当たる」ソート), monkey sort(「猿でもできる」ソート) などといった表現がある。なお最後のものは「猿でもできる」というよりも、[[無限の猿定理]]を指しているかもしれない。
'''ボゴソート''' ({{lang-en-short|bogosort}}) は、[[ソート]]の[[アルゴリズム]]の一つ。平均的な計算時間は[[ランダウの記号|O]](n&times;n!)で、非常に効率の悪いアルゴリズムとして知られている。[[安定ソート]]ではない。

ボゴソートは、「量子ボゴダイナミックス」というユーモラスな用語にちなんで名付けられている。その元は、bogus(偽の)である。英語では、random sort(不規則ソート), shotgun sort(数撃ちゃ当たるソート), monkey sort(猿でもできるソート) ともいう。


==アルゴリズム==
==アルゴリズム==
58行目: 57行目:
すべての要素が互いに異なる場合、時間計算量はO(n&times;n!)となる。実際の計算時間は、等しい要素が含まれているか、そしてそれらがどのくらいの頻度で含まれているかに依存する。
すべての要素が互いに異なる場合、時間計算量はO(n&times;n!)となる。実際の計算時間は、等しい要素が含まれているか、そしてそれらがどのくらいの頻度で含まれているかに依存する。


アルゴリズムの[[チューリングマシン停止問題|停止性]]は[[無限の猿定理]]により保証される。ただし[[計算機]]で[[擬似乱数]]を用て実行すると、入力によっては停止しない場合がある。
理論的には、このアルゴリズムの停止性は[[無限の猿定理]]に依ることになる。なお実際的には、現実の[[コンピュータ]]で実施した場合、[[擬似乱数]]のせ停止しないこともり得る。


==関連アルゴリズム==
==関連アルゴリズム==

2017年4月20日 (木) 02:50時点における版

ボゴソート
クラス ソート
データ構造 配列
最悪計算時間
最良計算時間
平均計算時間
最悪空間計算量

ボゴソート (bogosort) は、ソートアルゴリズムの一つ。平均的な計算時間はO(n×n!)で、非常に効率の悪いアルゴリズムとして知られている。安定ソートではない。「bogo」は、"bogus"[1]に由来する。

英語では、random sort(ランダムソート), shotgun sort(「数撃ちゃ当たる」ソート), monkey sort(「猿でもできる」ソート) などといった表現がある。なお最後のものは「猿でもできる」というよりも、無限の猿定理を指しているかもしれない。

アルゴリズム

トランプを順に並べる場合を例にすると、次のようになる。

  1. トランプ52枚の束を放り投げて、ばらばらにする。
  2. 1枚ずつ無作為にすべてを拾い集める。
  3. ソートされているか確認する。もしソート済みでなければ、1から3までの手順を繰り返す。

カードの束をひたすらシャッフルし続けて順番に並ぶまで待つアルゴリズムと考えてもよい。

疑似コード

function bogosort(array)
  while not is_sorted(array)
    array := random_permutation(array)

Perlによる実装

use List::Util 'shuffle';
sub is_sorted {
  for (1 .. $#_) {
    return 0 if ($_[$_ - 1] > $_[$_]);
  }
  return 1;
}
sub bogosort {
  until (is_sorted(@_)) {
    @_ = shuffle @_;
  }
  return @_;
}

C++による実装

#include <algorithm>
#include <random>
template <class RandomIter>
void bogosort( RandomIter first, RandomIter last )
{
  while( !std::is_sorted( first, last ) )
    std::shuffle( first, last, std::default_random_engine() );
}

計算時間および停止性

すべての要素が互いに異なる場合、時間計算量はO(n×n!)となる。実際の計算時間は、等しい要素が含まれているか、そしてそれらがどのくらいの頻度で含まれているかに依存する。

理論的には、このアルゴリズムの停止性は無限の猿定理に依ることになる。なお実際的には、現実のコンピュータで実施した場合、擬似乱数のせいで停止しないこともあり得る。

関連アルゴリズム

ボゾソート

ボゾソートも乱数に基づくソートのアルゴリズムである。リストがソートされていなければ二つの要素をランダムに取り出して入れ替え、リストがソートされているかどうかを調べる。ボゾソートの実行時間の解析は難しいが、H. GruberのAn Analysis of Perversely Awful Randomized Sorting Algorithms[2]に実行時間の見積もりが示されている。

関連項目

参考文献

  1. ^ http://catb.org/~esr/jargon/html/B/bogus.html
  2. ^ H. Gruber, M. Holzer and O. Ruepp: Sorting the Slow Way: An Analysis of Perversely Awful Randomized Sorting Algorithms, 4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007, Lecture Notes in Computer Science 4475, pp. 183-197.