私はソフトウェアのアルゴリズムの並べ替えと、O(nlogn)
ロードブロッキングを乗り越える可能な方法について考えていました。私はそれがIS実用的な意味でより速くソートすることが可能であるとは思わないので、私がそうすることを考えないでください。
とはいえ、ほとんどすべてのソートアルゴリズムでは、ソフトウェアが各要素の位置を認識している必要があります。それ以外の場合、いくつかのソート基準に従って各要素を配置する場所をどのように知るのでしょうか?
しかし、私がこの考えを現実世界と交差させたとき、遠心分離機は、分子を密度で「ソート」するときに、各分子がどの位置にあるのかわかりません。実際、それは各分子の位置を気にしません。しかし、各分子が密度と重力の法則に従うという事実により、比較的短時間で数兆個のアイテムを数兆個に分類することができます。
リストの順序を「強制」することは、各ノードのオーバーヘッド(各ノードに付加された値またはメソッド)で可能ですか?遠心分離機のようなもので、各要素のみが空間内の相対位置(他のノードとの関係)を考慮します。または、これは計算のルールに違反していますか?
ここで提起された大きなポイントの1つは、自然の量子力学的効果と、それらが同時にすべての粒子に同時に適用される方法です。
おそらく古典的なコンピューターは、本質的に並べ替えをO(nlogn)
のドメインに制限しているので、量子コンピューターはそのしきい値を超えて並列に動作するO(logn)
アルゴリズムにできる場合があります。
遠心分離機が基本的に パラレルバブルソート であるという点は正しいようです。これにはO(n)
という時間の複雑さがあります。
次の考えは、自然がO(n)
でソートできるのなら、なぜコンピューターができないのだろうかと思います。
編集:私は遠心分離機のメカニズムを誤解していましたが、それは比較を行うようです。ただし、2つのプロパティを比較するのではなく、並べ替えられるエンティティのプロパティを操作する物理プロセスがあります。この答えは、その性質のアルゴリズムをカバーしています。
遠心分離機は、要素間の比較によって実際に機能するのではなく、実際には個々の要素を個別にプロパティ(「遠心力」)によってソートするメカニズムを適用します。一部のソートアルゴリズム、特に Radix Sort がこのテーマに該当します。このソートアルゴリズムを並列化すると、遠心分離機の例に近づくはずです。
他の非比較ソートアルゴリズムには、 Bucket sort および Counting Sort があります。バケットの並べ替えは、遠心分離機の一般的な考え方に適合することもあります(半径はビンに対応する場合があります)。
各要素が個別に考慮される別のいわゆる「ソートアルゴリズム」は、 Sleep Sort です。ここでは、遠心力ではなく時間が選別に使用される大きさとして機能します。
計算の複雑さは、何らかの計算モデルに関して常に定義されます。たとえば、[〜#〜] o [〜#〜](n)典型的なコンピューターでは[〜#〜] o [〜#〜](2n) Brainfuck で実装されている場合。
遠心計算モデルにはいくつかの興味深い特性があります。例えば:
このようなものを汎用コンピューティングハードウェアに実装する能力がないため、モデルには実用的な関連性がない可能性があります。しかし、それから学ぶべきことがあるかどうかを調べるために、まだ調べる価値があります。 非決定論的アルゴリズム および 量子アルゴリズム は、どちらも現在実際に実装可能ではありませんが、たとえば両方とも活発な研究分野です。
トリックはそこにあります。遠心機を使用してリストをソートする可能性があるだけです。他の実世界の並べ替え[要出典]と同様に、リストを並べ替える確率を変更できますが、すべての値(原子)をチェックしないと確実ではありません。
「遠心分離機をどれくらいの期間使用する必要がありますか?」という質問を検討してください。
ピコ秒だけ実行した場合、サンプルは初期状態よりもソートされていない場合があります。または、数日間実行した場合、サンプルは完全にソートされます。ただし、実際に内容を確認しないとわかりません。
コンピュータベースの「順序付け」の実世界の例は、「ドローンの群れ」として知られる、互いに協調して動作する自律型ドローンです。ドローンは、個人としてもグループとしても行動および通信し、複数のターゲットを追跡できます。ドローンは、どのドローンがどのターゲットをたどるかを決定し、ドローン間の衝突を回避する必要性を明らかにします。これの初期バージョンは、フォーメーションのままでウェイポイントを移動するドローンでしたが、フォーメーションは変更される可能性があります。
「ソート」では、ドローンをプログラムして特定の順序でラインまたはパターンを形成し、最初に任意の順列または形状でリリースし、集合的かつ並行して、順序付けられたラインまたはパターンをすばやく形成します。
コンピューターベースの並べ替えに戻ると、1つの問題は1つのメインメモリバスがあり、多数のオブジェクトがメモリ内を並列に移動する方法がないことです。
各要素の位置を知る
テープソートの場合、各要素(レコード)の位置は、コンピューターではなく、「テープ」にのみ「認識」されます。テープベースの並べ替えは、一度に2つの要素とテープ上の実行境界(ファイルマーク、または異なるサイズのレコード)を示す方法でのみ動作する必要があります。
私は大学を始めたとき、高校の夏のオフィスで働いていました。私は、APコンピュータサイエンスなどで学んだことがありますソートと検索。
この知識を、思い出せるいくつかの物理システムに適用しました。
システムは、ファイルカードサイズのティアオフを含むマルチパートフォームを印刷しました。これは、引き出しの列にファイリングする必要がありました。
私はそれらの山から始め、最初から山を分類しました。最初のステップは5個ほどをピックアップすることで、手に簡単に配置できるほど少数です。ソートされたパケットを下に置き、各スタックを交差させて、それらを別々に保ちます。
次に、mergeスタックの各ペアを使用して、より大きなスタックを作成します。スタックが1つになるまで繰り返します。
次のカードは同じ開いている引き出しの少し下にあるので、ソートされたカードをファイルする方が簡単です。
これは、何度も教えようと試みたにも関わらず、私がこんなに早くやったことを誰も理解していなかった。
チェックスタブ(パンチカードのサイズ)の大きなボックスをソートする必要があります。大きなテーブルでソリティアをプレイしているように見えます。ディール、スタック、リピート。
30年前、私はあなたが尋ねていることに気づきました:比較と処理レコードの相対的なコストと、キャッシング。
私はあなたのトピックに関するエッセイを思い出し、それはspaghetti sortをもたらしました。乾燥麺の長さを切り取ってキー値を示し、レコードIDでラベル付けします。これはO(n)で、各アイテムを1回だけ処理します。
次に、バンドルをつかみ、テーブルの一端をタップします。それらは下端に揃えられ、ソートされます。一番長いものを簡単に外して、繰り返すことができます。読み出しもO(n)です。
「現実の世界」では、アルゴリズムに対応していない2つのことが行われています。まず、エッジの位置合わせは並列操作です。すべてのデータ項目もプロセッサです(物理法則が適用されます)。したがって、一般に、利用可能な処理をnでスケーリングし、基本的に古典的な複雑さをnの係数で除算します。
第二に、エッジの整列はどのようにソートを達成しますか?実際の並べ替えは、didを比較して最長を見つける場合でも、1回のステップで最長を見つけることができる読み取りにあります。繰り返しますが、nで割ると、最大値を見つけるのはO(1)になります。
もう1つの例は、アナログコンピューティングの使用です。物理モデルは問題を「即座に」解決し、準備作業はO(n)です。原則として、計算は、準備されたアイテムの数ではなく、相互作用するコンポーネントの数でスケーリングされます。したがって、計算はn²に比例します。私が考えている例は、マップに穴を開け、穴を通過するストリングからウェイトを吊り下げ、リング上のすべてのストリングを収集することによって行われた、重み付き多要素計算です。
私見、人々はlog(n)を考え過ぎます。 O(nlog(n)) IS実質的にO(n)。そして必要なのはO(n)データを読み取ります。
クイックソートなどの多くのアルゴリズムは、要素をソートする非常に高速な方法を提供します。実際には非常に高速なクイックソートのバリエーションを実装できます。
本質的にすべての物理システムは無限に並列です。砂粒の中に原子のバットロードがあるかもしれませんが、自然には各atomの各電子がどこにあるべきかを把握するのに十分な計算能力があります。 )プロセッサ)log(n)時間でn個の数字をソートできます。
コメントから:
K個の要素を持つ物理プロセッサの場合、最大でO(k)の並列性を実現できます。 n個の数字を任意に処理する場合でも、kに関連するレートで処理されます。また、この問題を物理的に定式化することもできます。エンコードする数に比例した重量でn個のスチールボールを作成できます。これは、理論上の遠心分離機で解決できます。ただし、ここで使用している原子の量はnに比例しています。一方、標準的なケースでは、プロセッサ内のアトムの数は限られています。
これについて考えるもう1つの方法は、各番号に小さなプロセッサが接続されており、各プロセッサがその隣のプロセッサと通信できる場合、これらのすべての番号をO(log(n))時間。
並べ替えは、まだO(n)合計時間です。それよりも速いのは、Parallelizationのためです。
遠心分離機は、nコアで並列化されたn個の原子の Bucketsort として表示できます(各atomプロセッサとして機能します)。
並列化によりソートを高速化できますが、プロセッサの数が制限されているため、一定の要因によってのみ、O(n/C) is O(n) =(CPUは通常<10コア、GPU <6000)
遠心分離機はノードをソートせず、ノードに力を加えてからノードと並行して反応します。したがって、各ノードがその「密度」に基づいて上下に並行して移動するバブルソートを実装する場合、遠心分離機の実装が必要になります。
現実の世界では非常に大量の並列タスクを実行できますが、コンピューターでは物理処理ユニットの数に等しい最大の並列タスクを実行できます。
最後に、2つのノードで同時に変更することはできないため、要素のリストへのアクセスも制限されます...
まず、2つの異なるコンテキストを比較します。1つはロジック(コンピューター)、もう1つは物理学です(これまでのところ)数式を使用してその一部をモデル化できることが証明されており、プログラマーはこの数式を使用してシミュレートできます(一部の)ロジックワークの物理(ゲームエンジンの物理エンジンなど)。
第二に、コンピューター(論理)の世界では物理学ではほとんど不可能な可能性があります。たとえば、メモリにアクセスして各エンティティの正確な位置を毎回見つけることができますが、物理学では大きな問題です ハイゼンベルクの不確定性原理 。
第三に、実際の世界の遠心分離機とその操作をコンピューターの世界にマッピングしたい場合、物理学のすべてのルールが適用されたスーパーコンピューターを誰か(神)が与えて、小さなソートを行っているようです(遠心分離機を使用して)、ソートの問題はo(n).
リストの順序を「強制」することは、各ノードのオーバーヘッド(各ノードに追加された値またはメソッド)で可能ですか?
コンピュータープログラムを使用して並べ替える場合、並べ替えられる値のプロパティを選択します。これは通常、数字の大きさまたはアルファベット順です。
遠心分離機のようなもので、各要素のみが(他のノードとの関係で)空間内の相対位置を考慮する
この類推は、単純なバブルソートを適切に思い出させます。各反復で小さい数値がバブルアップする方法。遠心分離ロジックのように。
それで、これに答えるために、私たちは実際にソフトウェアベースのソートでそのようなことをしませんか?
別の見方では、遠心分離機で説明しているのは、「スパゲッティソート」と呼ばれるものに類似しているということです( https://en.wikipedia.org/wiki/Spaghetti_sort )。さまざまな長さの未調理のスパゲッティロッドの箱があるとします。それらを拳で保持し、手を緩めて垂直に下げ、両端がすべて水平なテーブルに載るようにします。ブーム!それらは高さでソートされています。 O(constant) time。(またはO(n)高さで棒を取り出してスパゲッティラックに入れることを含めた場合、私は推測する?)
スパゲッティのピースの数はO(constant)ですが、スパゲッティの音速は有限であるため、O(n)最長のストランドの長さ。
考慮してください:「遠心分離機」本当にスケーリングは良いですか?スケールアップするとどうなるかを考えてください。
遠心分離機に関する他の問題も考慮する価値があります。たとえば、狭いサイズスケールでのみ操作できます。コンピューターのソートアルゴリズムは、1から2 ^ 1024までの整数を処理でき、汗をかきません。水素atomの2 ^ 1024倍の重量の何かを遠心分離機に入れると、それはブラックホールであり、銀河は破壊されました。アルゴリズムは失敗しました。
もちろん、ここでの本当の答えは、他の答えで述べたように、計算の複雑さはある計算モデルに関連しているということです。また、「遠心分離ソート」は、RAM modelまたはIO model or multitape Turing machine。)などの一般的な計算モデルのコンテキストでは意味がありません。