ビーズソートのソースを表示
←
ビーズソート
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''ビーズソート'''または'''重力ソート'''とはJoshua J. Arulanandham、Cristian S. Calude、Michael J. Dinneenの3人によって2002年に発見された[[ソート]][[アルゴリズム]]である。ヨーロッパ理論計算機科学会で発表された。ソフトウェアでの実装でも、ハードウェアでの実装でも時間計算量は''O''(''n'')であるが、特にソフトウェアでの実装では時間がかかることがあり、負の数のソートには使えないという欠点も持つ。また、少なくともこのアルゴリズムは空間計算量が''O''(''n<sup>2</sup>'')である。 ==アルゴリズムの概要== [[File:BeadSort-Figure1.svg|thumb|right|ステップ 1: 垂直な糸にビーズを通す。]] [[File:BeadSort-Figure2.svg|thumb|right|ステップ 2: ビーズが重力に従って落ちる。]] ビーズソートの処理は、平行に並べられた糸をビーズが滑り落ちる様子で理解できる。図のステップ1では、''n''=5行''m''=4列の糸を考える。下から''n''行目は''n''個目のデータを格納する場所であり、1行目と2行目に3つずつビーズがあるため、1個目と2個目のデータが3であることを表している。<ref name="rowconventions">慣例では、''k''を表す時、1本目から''k''本目の糸にビーズを通し、''k''+1本目から''m''本目までは空にする。必須要件ではないが、実装上このようにするとわかりやすい。</ref> ここでビーズを重力に従って落下させると、それぞれの行の値がソート後の値となる。1行目は最大の数であり、''n''行目が最小の数である。もし上記の脚注通り左詰めでビーズを入れた場合、ビーズの右端の位置でソートの結果がわかる。 ハードウェアでの実装において、ビーズを「落下させる」ことを可能にする動作は、より高い行からより大きな値をより低い行に伝播させることを可能にした。 ''a''行目の値が''a''+1行目の値よりも小さい場合、''a''+1行目の一部のビーズは''a''行目まで落下する。''a''行目のビーズが存在している場所は''a''+1行目のビーズの落下を物理的に邪魔するため、自動的に値が入れ替わる。 ビーズソートのメカニズムは[[計数ソート]]の背景にあるメカニズムと似ており、それぞれの行に存在するビーズの数は、その段数以上の値を持つ要素の数に対応する。 ==計算複雑性== ビーズソートは、計算複雑性が異なる4種類の実装が可能である。 *''O''(1): ビーズは落下距離にかかわらず単位時間で落下するとするモデル。実際には実装できない抽象化されたビーズソートである。 *''O''(<math>\sqrt{n}</math>): 重力を用いる物理モデル。落下距離は時間の2乗に比例するため、落下時間はデータの数の平方根に比例する。 *''O''(n): ビーズが等速で移動するモデル。ソフトウェアでの実装では、下にビーズがあるかを確認するため、この時間計算量が相当する。 *''O''(S): Sはビーズの総数であり、ソフトウェアでの実装では、各ビーズに対して落下可能かを確認する効率的なアルゴリズムが存在しない場合、この計算量となる。 [[鳩の巣ソート]]のように、ビーズソートの最悪計算量が''O''(''n''log)を下回る点で珍しく、最良計算量は比較ソートの最悪計算量である。ビーズソートの要素は非負整数であり、その制約を利用するため、このような高速なソートが可能である。 == 実装例 == Pythonでの実装例を以下に示す。ビーズの「落下」は少し異なる実装である。 <syntaxhighlight lang="python3" line="1"> def Gravity(obj): if all([type(x) == int and x >= 0 for x in obj]): reference = [range(x) for x in obj] else: raise ValueError("入力は正の整数である必要があります") intermediate = [] index = 0 previous = sum([1 for x in reference if len(x) > index]) while previous: intermediate.append(range(previous)) index += 1 previous = sum([1 for x in reference if len(x) > index]) index = 0 previous = sum([1 for x in intermediate if len(x) > index]) out = [] while previous: out.append(previous) index += 1 previous = sum([1 for x in intermediate if len(x) > index]) out = out[::-1] return out """how it does it: it counts the "beads" in each column, then uses those numbers to make a new set of rows. Adding up the beads in each column after turning the initial sums into the new rows gives the backwards version of the sorted list, which is then turned around using list slicing. If you believe you understand how the code does it and think you can describe it better, feel free to edit this description. Note: 0を含むと、 prev が0となり、while文が止まってしまう可能性がある""" # contributed by an amateur programmer. Feel free to test & use it. </syntaxhighlight> ==参考文献・注釈== <references/> ==外部リンク== *[http://mgs.spatial-computing.org/ImageGallery/EXEMPLES/BeadSort/index.html Bead Sort in MGS], a visualization of a bead sort implemented in the [http://mgs.spatial-computing.org MGS] programming language *[http://mathworld.wolfram.com/Bead-Sort.html Bead Sort on MathWorld] {{ソート}} {{DEFAULTSORT:ひいすそおと}} [[Category:ソート]] [[Category:アルゴリズム]] [[Category:データ処理]]
このページで使用されているテンプレート:
テンプレート:ソート
(
ソースを閲覧
)
ビーズソート
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報