10


3

比較が人間によって行われる項目をソートしたいです。

  • ピクチャー

  • 作業項目の優先順位

  • …​

これらのタスクでは、比較の数がパフォーマンスの制限要因になります。

  • 必要な比較の最小数はいくつですか(私は* N *項目のために> * N *を仮定します)?

  • この最小数を保証するアルゴリズムはどれですか。

11 Answer


5


http://en.wikipedia.org/wiki/Pigeonholing[Pigeon hole並べ替え]はN次であり、データにハトがあれば人との相性がいいです。 良い例は、選挙で投票を数えることです。


5


これに答えるために、我々は多くの仮定をする必要があります。

私たちが写真を可愛さで分類しているとしましょう。 目標は、最小限の時間で最大の使用可能な情報を人間から入手することです。 この相互作用は他のすべての計算を支配するので、それが重要なのはそれだけです。

他の誰かが述べたように、人間は1回のインタラクションで複数のアイテムを注文することにうまく対処できます。 ラウンドごとに8つのアイテムを相対的な順序で取得できるとしましょう。

各ラウンドは、ノードがピクチャである有向グラフに7つのエッジを導入します。 ノードAがノードBから到達可能である場合、ノードAはノードBよりもかわいいです。 このグラフを覚えておいてください。

それでは、海軍と空軍の解決方法の違いについてお話しましょう。 彼らは両方とも、高さ順にそして素早く集団を得ることを望んでいます。 海軍は、列に並ぶように人々に言います、そして、あなたがあなたの前の人より短いならば、場所を変えて、そして終わるまで繰り返してください。 最悪の場合、それはN * Nの比較です。

空軍は人々に正方格子の中に立つように言う。 彼らは、sqrt(N)の人々を前後にシャッフルします。これは、最悪の場合を意味します。 == N個の比較しかし、人々は1つに沿って並べ替えられています 寸法。 したがって、人々は左を向いてから、もう一度同じシャッフルを行います。 これで、2 * Nまでの比較が可能になりました。ソートはまだ不完全ですが、政府の作業には十分です。 短いコーナー、反対側の高いコーナー、そして明確な斜めの高さのグラデーションがあります。

完璧を気にかけなければ、空軍法がどのように結果を得るのかをより短時間で確認できます。 効果的に完成度を得る方法も見ることができます。 あなたはすでに、最短と最長の男性が2つのコーナーにいることを知っています。 2番目に短い人は最も短い人の後ろにいるか横にいるか、3番目に短い人は彼の後ろにいるか横にいる可能性があります。 一般的に、誰かの身長は、ショートコーナーからの彼の可能な限り最大のマンハッタン距離です。

グラフの類推を振り返ると、各ラウンドを提示する8つのノードは、現在最も一般的な長さが最も長いインバウンドパスを持つノードのうちの8つです。 最長のインバウンドパスの長さも、ノードの最小のソート可能ランクを表します。

この計画に従ってCPUを大量に使用しますが、人的資源を最大限に活用することになります。


3


あなたは人間が非推移的な比較をするかもしれないことを考慮すべきです。 彼らはBよりA、CよりB、AよりCを好む。 だからあなたのソートアルゴリズムを選ぶとき、それが起こったときにそれが完全に壊れないことを確かめなさい。


3


人々は最善から最悪まで5〜10個のものを注文するのが本当に得意で、そうするときより一貫した結果を思い付きます。 私は古典的なソートアルゴを適用しようとすることは典型的に人間のマルチ比較アプローチのためにここではうまくいかないかもしれないと思います。

私はあなたがラウンドロビンタイプのアプローチを持っていて、毎回物事を彼らの最も一貫したグループにまとめるようにするべきであると主張するでしょう。 各繰り返しは結果をより確実にするだけです。

書くのもおもしろいですね:)


3


私がかつてこの件に関して行った課題から…​

比較カウントは、データをランダムな順序で操作するさまざまなソートアルゴリズム用です。

サイズQkSort HpSort MrgSort ModQk InsrtSort 2500 31388 48792 25105 27646 1554230 5000 67818 107632 55216 65706 6082243 10000 153838 235641 120394 141623 25430257 20000 320535 510824 260995 300319 100361684 40000 759202 1101835 561676 685937 80000 1561245 2363171 1203335 1438017 160000 3295500 5045861 2567554 3047186

これらの比較カウントは、「ほぼソート済み」で開始されたデータを操作するさまざまなソートアルゴリズム用です。 とりわけクイックソートの病理学的ケースを示しています。

サイズQkSort HpSort MrgSort ModQk InsrtSort 2500 72029 46428 16001 70618 76050 5000 181370 102934 34503 190391 3016042 10000 383228 226223 74006 303128 12793735 20000 940771 491648 158015 744557 50456526 40000 2208720 1065689 336031 1634659 80000 4669465 2289350 712062 3820384 160000 11748287 4878598 1504127 10173850

このことから、マージソートが比較数の点で最も優れていることがわかります。

クイックソートのアルゴリズムに対する変更がどのようなものであったかは思い出せませんが、個々のチャンクが特定のサイズになると、挿入ソートが使用されたものだと思います。 この種のことは、クイックソートを最適化するためによく行われます。

また、高岡忠雄氏の ' Minimal Merge Sort'を調べてみましょう。ソートをマージします。


2


比較が簿記のコストと比較して高価であるなら、あなたは私が "トーナメントソート"と呼ぶ以下のアルゴリズムを試すかもしれません。 まず、いくつかの定義:

  1. すべてのノードは、数値の "score"プロパティ(1からノード数までの値を保持できる必要があります)、および "last-beat"プロパティと "fellow-loser"プロパティを持ちます。

  2. あるノードを他のノードよりも先に出力する必要がある場合、そのノードは他のノードより「優れて」います。

  3. 出力された要素よりも優れていることがわかっている要素がない場合、要素は「適格」と見なされ、出力されていない要素がそれより優れていることがわかっている場合、「不適格」と見なされます。

  4. ノードの「スコア」は、それが1より優れていることがわかっているノードの数です。

アルゴリズムを実行するには、最初にすべてのノードにスコア1を割り当てます。 最もスコアの低い2つの適格ノードを繰り返し比較します。各比較の後、敗者に「不適格」のマークを付け、敗者の得点を勝者の得点に追加します(敗者の得点は変更されません)。 敗者の「仲間の敗者」プロパティを勝者の「最後の拍子」に設定し、勝者の「最後のビート」プロパティを敗者に設定します。 適格なノードが1つだけ残るまでこれを繰り返します。 そのノードを出力し、(勝者の "last-beat"と "fellow-loser"プロパティのチェーンを使用して)すべてのノードに勝者ビートを設定します。 その後、残りのノードでアルゴリズムを続けます。

1,000,000アイテムとの比較数は、Quicksortのストックライブラリ実装のそれよりわずかに少なかった。このアルゴリズムが最新バージョンのQuickSortとどのように比較されるかはわかりません。 簿記のコストはかなりのものですが、比較が十分に高ければ、節約はおそらくそれだけの価値があるでしょう。 このアルゴリズムの興味深い特徴の1つは、次に出力されるノードの決定に関連する比較のみが実行されることです。私はその機能を持つ他のアルゴリズムを知らない。


1


私はあなたが ソートに関するウィキペディアのページよりも良い答えを得ることができるとは思わない。

概要:

  • 任意の比較(基数ソートのようなものを使うことができない場合)のためにあなたが達成できる最高のものはO(n log n)です

  • さまざまなアルゴリズムがこれを実現しています - 「アルゴリズムの比較」を参照してください。

  • よく使われるQuickSortは典型的な場合O(n log n)ですが、最悪の場合O(n ^ 2)です。これを回避する方法はよくありますが、比較のコストが本当に心配な場合は、MergeSortまたはHeapSortなどを使用します。 それはあなたの既存のデータ構造に部分的に依存します。

人間が比較をしているのなら、彼らはソートもしているのでしょうか? 使用する必要がある固定データ構造がありますか。それとも、平衡型2分木挿入ソートを使用して効果的にコピーを作成できますか? ストレージ要件は何ですか?


1


http://en.wikipedia.org/wiki/Stable_sort#Comparison_of_algorithms[Here]はアルゴリズムの比較です。 2つのより良い候補はクイックソートとマージソートです。 クイックソートは一般的には優れていますが、パフォーマンスが最悪の場合に最悪になります。


1


Map / Reduce型アルゴリズムを使用して複数の人間に比較を並行して実行させることができるので、マージソートは間違いなくここに行く方法です。

クイックソートは基本的にシングルスレッドのソートアルゴリズムです。

また、2つのオブジェクトを比較する代わりに、5つのアイテムのリストを使用してそれらをランク付けするように依頼するように、マージソートアルゴリズムを調整することもできます。

もう一つの可能​​性は有名な "Hot or Not"ウェブサイトによって使用されるようなランキングシステムを使用することでしょう。 これにはさらに多くの比較が必要ですが、比較はどのような順序でも並行して行うこともできます。十分な数のヒューミノイドを自由に使えるのであれば、これは古典的なソートよりも速く動作します。


1


質問はもっと多くの質問を提起します。

私たちは一人の人間と比較して話していますか? あなたが順番にオブジェクトを配置しようとしている人間のグループと話しているならば、それは非常に異なる挑戦です。

信頼と間違いの質問はどうですか? 誰もが信頼したり、すべてを正しくしたりできるわけではありません。ある時点で、1つの比較に対して誤った答えを提供した場合、ある種のソートは壊滅的に間違ったものになります。

主観についてはどうですか? 「かわいい順にこれらの写真をランク付けする」。 この点に達すると、それは本当に複雑になる可能性があります。 他の誰かが言っているように、 "hot or not"のようなものは概念的には最も単純ですが、あまり効率的ではありません。 最も複雑なのは、Googleがオブジェクトを並べ替える方法で、検索エンジンが人間による比較を推測しているということです。