質問

ようかと思ってるんだ最近のオブジェクト指向デザインの選別アルゴリズムです。しかできなかった見方に来ても近いのでこの仕分けのアルゴリズムの選別をO(n)時間。

Ok、こちらのはどうかと思ってるんだ。をセットにした入力データです。私が割り当て量をそれぞれの入力データと入力データタイプの MassSphere.だと考えると全てのオブジェクトの完全な球体オブジェクトの形状に比例した量の最も大きい一に接地します。.かを全ての入力データ空間にすべて同じ距離。いくつか担当しています。による重力法有数の曲を地。の順予約なら、世界最大のオンラインきたいと思っていソートされます。これは面白いものが下にいきの○○がんのことを学びま

でもするようになったきっかけに選別技術を使用する様子をリアルタイムで観察のようなシナリオやんカ/生。

編集: がすべてのオブジェクトに同時にこを導入しました球状のオブジェクトコンセプト。

役に立ちましたか?

解決

このことがもの アイデア のOOPが可能となりましたがモデルは、かなりの直接の対応関係はどうか現実の世界とかをシミュレートします。

想像は実際の手順で必要なお手続き:

  1. オブジェクトが建設するための各項目のデータです。ほとんど現代のハードウェア、それだけではな繰り返しこの作戦にはO(n)時 ベスト.
  2. の効果の重力が必要となる場合があるのシミュレーションのための各オブジェクトです。再度、目の前にある、ことりと触れ合わかりやすく実用化するに対して繰り返し処理を実行する.
  3. の各オブジェクト地の表面には"地球"にプログラミングモデルにおいて捕まり、一部の実装に特定の機構に対応するオブジェクトが必要となる場合があるに挿入順序付きリスト、結果として

を考慮した問題の一層のご紹介を追加合併症について自分自身に尋ねこどの高い位置づける必要があるこれらのオブジェクトから始める?明らかに高く、一方で実際に ;つまり遠くからの地球の半径最大級のオブジェクトです。がどのようにして知りましたかかる。ですか最初の決定は最大級のオブジェクトの編集また、(しょう)が必要で繰り返し処理.もうこのシミュレーションが下記からダウンロードしようとするシミュレーション時の動作という概念物 実際に 落;その後は自分自身を見つけるでしょうへの追加アイテムを例文、ネイティブコレクション(動作するかを明らかにゼロ以外の時間)ると同時に新たな衝突を検出するこの作スレッド問題です。

短いトラブルを想像しかにこのアイデアが具体的運用が適正に行われるこを使っているだけではOOP特別なハードウェアとはいうものの、本当に 良い方法がありました。を思い出していいの ビーズソート--アルゴリズムはないのと同じアイデア、分別解決のための非常に物理的概念の重力は、驚くべきことではないが、特定のハードウェア.

他のヒント

あなただけの問題を修正再表示しました。必要があります重力の影響の順序を計算すると、最高の状態で、ソートアルゴリズムのOは、あなたがビートにしようとしています。

重力計算は現実の世界では無料で利用できます。プログラムの開発では、それをモデル化する必要があります。これは、複雑さの最小値で別のnになります。

汎用ソートは(N Nログ)最高Oで証明可能です。これを改善するために、あなただけの値を比較する方法以外のデータについて何かを知っている必要があります。

値は基数ソートのすべての数字が、ある場合は、あなたが持っていると仮定するとO(n)を提供します数値の上限と下限。このアプローチは、任意の数を処理するために拡張することができる - 、最終的に、コンピュータ内のすべてのデータは、数字を用いて表されます。たとえば、あなたは基数ソートできる文字列をすることにより、各パスで、それが数字であるかのように1つの文字で並べ替えます。

残念ながら、基数ソートを通過するの可変数を作るデータ手段の変数のサイズを扱います。あなたは(kビットはあなたのために署名した符号なし、半分(2 ^ K)-1までの値を与えるため)mが最大値であり、O(NログM)で終わります。たとえば、あなたがよく、0からM-1までの整数をソートしている場合 - 。あなたは、実際に再びOを(N Nログ)持っている。

は別の問題を翻訳することは非常に良いアプローチすることができ、時にはそれだけでオーバーヘッド複雑さの別の層を追加しています。

発想は単純に思えるかもしれないが、この場合では、現実世界とモデル化の違いは、現実の世界では、すべてが並列に起こっているということです。あなたは、彼らがフィニッシュ順にリストに追加するには、スレッドセーフな方法で別のスレッドで各オブジェクトを考えることから始めなければならないだろう説明するように、重力の並べ替えをモデル化します。現実的に仕分けパフォーマンスの面では、おそらくちょうど倍にクイックソートを使用し、またはそれらは落下の割合は、同じ距離にあることから。あなたの式は質量に比例している場合は、あなただけのすべてが、ソート質量をスキップ思います。

架空の「重力コンピュータ」でソートのこの種を解決するためにO(1)を取ります。しかし、我々はそれを知っているように、実際のコンピュータ、あなたの横の考えではないに役立つだろう。

あなたは、彼らは地面を打つのにかかるすべての時間を計算したら、

、あなたはまだ、これらの値をソートする必要があります。あなたが本当に何を得ていない、あなただけのいくつかの余分な不必要な計算を実行した後に異なる番号をソートしています。

編集:おっと。忘れた物理学彼らは同時に、すべてのヒットよもちろん101。 :)

は、次のようにモデル化する任意の並べ替えは、ちょうど別の一つに1並べ替え問題を変換します。あなたは何を得ることはありません。

誰もが言及したことを、すべての欠陥を無視して、基本的にこれはO(n^2)アルゴリズムではなく、O(n)に沸きます。あなたは、すべての「球」を反復処理「最も重い」または「最大」ものを見つけるし、リストにプッシュし、すすぎと繰り返しする必要があると思います。すなわち、第1のグランドに当たるものを見つけるために、あなたは全体のリストを反復処理する必要があり、それは最後の一つだ場合、それは第二のなど、O(n)を取ることができるだろう、O(n-1)時間がかかるだろう...しかし、それよりも悪いです、あなたは、あなたが最初の場所でに興味を持っていた値でソートしていることができるときだけ、いくつかの役に立たない「時間」の値を計算する数学演算の束を毎回実行する必要があります。

うーむ。重力並べ替えます。

重力のあなたの特定のモデルが間違って無視して、このアイデアは、私たちを取るところを見てみましょう。

物理的な現実が10 ^ 80プロセッサを持っています。

ソートの実際の下限はNをソートするためにN / 2プロセッサを持っている場合、ログ(N)であることが知られているオブジェクト

あなたが利用可能ないくつかのCPUコアを持っている場合は、複数のスレッド上でマージを実行することができない理由はありません。

ソートあなたに似たのであるスパゲッティソートと呼ばれる非常に有名なソートアルゴリズムは実際にあります。 あなたはウェブ上での多くの分析のいくつかをチェックアウトすることができます。例えば cstheoryするます。

スパゲッティ

これは間違いなくあなただけが適切なハードウェアがそれをサポートしている必要がありますする必要があります。そうでなければ、これは非常にクールなアイデアを聞こえます。ホープ誰かのプレゼントは、このクレイジーな夢を作るためのIEEE紙を可視ます。

私はアイデアが大好き!それは賢いです。他の人が言っているイエスは、O(N Nログ)バインドが証明可能低く、一般的に並べ替え問題にバインドされている、我々はその下限であることを心に留めておく必要があること、正しいの一般的にのですが唯一の比較に基づくのモデルに当てはまります。あなたがここで提案されていることは、それがさらに思考に値するし、全く異なるモデルです。

ジェームズと行列が指摘したように、

また、重い1が速く軽いものよりも移動しない、あなたは明らかに重い物(数が)確かに、さらに/速い旅行をするだろう何かにモデルを適応させる必要がある(またはあなたは何とか数字を区別できるように)、低速/以下、さらに(遠心分離機)は、同様頭に浮かぶます。

より多くの思考が必要ですが、あなたのアイデアがシャープである!

(編集) 今エンリケのPhys2Dのアイデアを見て、私はそれが全体の多くの理にかなっていると考えています。

私が示唆していることの一つは、間違いなく今の効率の側面を無視することです。 (私が知っている、私はそれが全体の目標でした知っています)。これは、新しいモデルであり、我々は最初のアイデア、およびその実装の間のギャップを埋める必要があります。そうして私たちは、このモデルのために何時間複雑でも手段を理解することができます。

と思うのに対し、大きな違い:また、ボトムスの面で高さの異なるようにした時点で同一の軽重の最大のままに、二番目に大きい第二等これは本質的に同等の回線を利用したより球体に---きっというheightOffTheGround=MAX_VALUEする。

まもな心配をする必要が加速過時間---かなか速いたリアルな物理ができてすべての初期速度xからである。

問題はそのまほう遡及訂正の問題を解決でこのような(擬似コード):

int[] sortedArray; // empty
int[] unsortedArray; // full of stuff
int iVal = MAX_INT_VALUE;
while (true)
{
    foreach (currentArrayValue in sortedArray)
    {
        if (iVal = current array value
        {
            put it in my sortedArray
            remove the value from my unsortedArray
        }
    }
    if (unsortedArray is empty)
    {
        break;  // from while loop
    } 
    iVal--
}

問題は、その物理エンジンなんかのに対して繰り返し処理を実行する毎にユニットにするにはO(1)と... 非常に 大型の定数を---一定数のデルタの値は、このシステムが走ります。最寄の大多数がこれらのデルタの値を、基本的にするを得ないの答え:その繰り返し処理はこれまでの球/ライン/いすに移転すが----なします。

きしだけ言う、もうスキップで多くの仲介の手順でジャンプ先までのヒット!ものであることを知るひとつは、最大級の---やだの分別の問題です。

私はあなたのアイデアを少し適応します。私たちは、オブジェクトを持っていますが、彼らは重量ではなく、スピードに違いはありません。だから、始まるすべてのオブジェクトで始まる行で開始し、ショットに整列されている、彼らよフィニッシュまで、それぞれの速度を持つすべての動きます。

クリア十分:仕上げの最初のオブジェクトは、それがあると言って、信号を発します。あなたはそれがあった結果、紙への信号との書き込みをキャッチします。

さて、あなたはそれをシミュレートしたいと思うようにします。

私たちはL=1であるためにあなたのフィールドの長さを取ります。ステップサイズ∆tであなたのNのそれぞれは、一度に移動vᵢ∙∆tの長さをオブジェクト。 ことを意味し、各オブジェクトは、フィニッシュに到達する前にsᵢ = L / (vᵢ∙∆t)のステップを必要とします。

のポイントは今、非常に近い速度で二つの物体を区別するために、あなたのすべてのオブジェクトの異なるステップサイズを持っている必要があります。

ここで、の最良の場合には、この手段は、そのオブジェクト1つの2の一の工程、物体2の仕上げなど。したがって、ステップの総数はS = 1 + 2 + … + N = N∙(N + 1)/2あります。これは、注文N∙Nである。

それが最良の場合ではないと速度が等しく互いに近接していない場合は、

は、あなたがステップサイズと効果における反復より多くの時間を下げる必要があります。

コンピュータは、いくつかの基準に基づいてソートされたオブジェクト(全くばかげていない考えるように)ことをビルドするとしたら、私は複雑さの順序は、オブジェクトの数とは何の関係もないだろうと考えているが、むしろ率ローカル加速度の重力による。それは地球でモデリングだと仮定すると、複雑さがあろうO(G <サブ> 0 )ここで、G <サブ> 0 である

altテキスト

単純な推論は、それらの中心が開始時に整列される場合に、球状オブジェクト(n)の数は無関係であることです。また、重力加速度は、それが増加するにつれて高さ自体よりもはるかに大きな影響を与えることになります。私たちは10倍ですべてのオブジェクトの高さを増やす場合例えば、それは彼らに地面を打つために10倍の時間がかかるが、はるかに少ないではないでしょう。加速度が実際に2つのオブジェクト間の距離に依存するが、我々はなく、特定の値よりも大きな画像に、より興味を持っているとしてそれを無視することができ、これは、様々な無視できる近似を含む。

素晴らしいアイデアにもかかわらずます。

また、私は@Jeremyにより投稿された映像を、硬貨選別が大好きです。そして最後に、オブジェクト志向は、このようなAのマシンを構築する上で、私の懸念の少なくともだろう。それについてもっと考えて、ここでは、このようなAのマシンを構築する上で私の愚かな2セントだ。

<ストライキ> O 0 o O o

. . . . .
. . . . .
. . . . .
= = = = =

すべてのオブジェクトは、私たちがでソートする基準に比例した様々なサイズです。彼らは、最初に各球の中心を通る細いロッドによって水平に一緒に保持されます。底部の=は、特別にできるだけ早くそれらは球体と衝突するように、どこかの値(必要に応じてそれらの位置)を記録するように設計されています。すべての球が衝突した後、我々は記録された値に基づいて、当社のソート順序を持つことになります。

  

Debilskiの回答するから:

     

私はあなたのアイデアを少し適応します。私たちはやります   私たちのオブジェクトを持っていますが、それらは異なっていません   重量ではなく、スピードインチで、だから、   始まるすべてのオブジェクトがで並んでいます   スタートで始まる行と   ショット、それらはすべて自分で移動します   仕上げに、それぞれの速度ます。

     

クリア十分:仕上げの最初のオブジェクト   それは言って、信号を発します   そこ。あなたは、信号や書き込みをキャッチ   それがあった結果の紙

私はさらに一歩それを簡素化し、これらのオブジェクトはランダムな正の整数であると思います。そして、我々は、彼らがゼロに近づくと、彼らが最初に整数そのものに等しいゼロdからの距離を持っているので、昇順にソートしたいです。

シミュレーションと仮定すると、離散時間ステップで行われ、すなわち、のフレームの、すべてのフレームでは、すべてのオブジェクトの新しい距離は次のようになりますときにそのd = d - v d ≤ 0とオブジェクトがリストに追加さになるだろう。それは、一つの減算及び1つの条件です。リニア

:各オブジェクトについて、計算はO(N)であると思われるので、2つの離散的なステップ キャッチがあり、それはを1つのフレームのための線形であるのみ!仕上げに必要なfフレームの数を乗じて。シミュレーション自体はO(NF)である:二次

。 我々は、引数tとしてフレームの持続時間を取る場合は、しかし、我々は反比例的にフレームfの数に影響を与える能力を取得します。私たちは、tを減らすためにfを増やすことができますが、これは精度を犠牲にしています、より多くの我々は、彼らがない場合でも、2つのオブジェクトが同じ時間枠で終了することをより多くの確率は、したがって、同等のものとして記載されていることが、tを高めます。 (それはほとんどの有限要素シミュレーションコンテキストであるように)私たちは、調整可能な精度でアルゴリズムを得るように、

私たちは、さらに再帰+適応アルゴリズムにそれを回すことにより、これを絞り込むことができます。人間のコードでは、それは次のようになります:

function: FESort: arguments: OriginalList, Tolerance
  define an empty local list: ResultList

  while OriginalList has elements
    define an empty local list: FinishedList
    iterate through OriginalList
      decrement the distance of each object by Tolerance
      if distance is less than or equal to zero, move object from OriginalList to FinishedList

    check the number of elements in FinishedList
      when zero
        set Tolerance to double Tolerance
      when one
        append the only element in FinishedList to ResultList
      when more
        append the result of FESort with FinishedList and half Tolerance to ResultList

  return ResultList

誰かのために働くすべての本当の同様の実装があります場合、私は思ったんだけど。

確かに興味深い件名:)

PS。上記の擬似コードは、擬似コードの私の考えで、1がある場合は、より読みやすいまたは準拠方法でそれを書き換えること自由に感じて下さい。

私は同じことを考えていたいくつかの週間前ます。

私はそれを実装するために Phys2D のライブラリを使用することを考えました。これは、実用的なが、楽しみのためだけではないかもしれません。また、オブジェクトに割り当て負の重みは、負の数を表現することができます。負の重みを持つオブジェクトは、正の重みで屋根やオブジェクトに移動しますので、phys2dライブラリを使用すると、床と屋根の間に同じ距離で床と屋根の間の中間にあるすべてのオブジェクトを配置.Then落ちるだろう重力を定義することができます。あなたは長さ=オブジェクトの数の結果の配列rを[]があると。その後、オブジェクトを使用して、配列r [0]の開始時に、それを追加し、屋根に触れると、カウンタをインクリメント、次回は、オブジェクトがRであなたがそれを追加し、屋根に触れるたびに[1]は、毎回のオブジェクトは、床、あなたに達します配列R [r.length-1]の最後に追加し、あなたがRでそれを追加次回[r.length-2]。終わりに(中央に浮い滞在)移動しなかったオブジェクトは、(これらのオブジェクトは0である)の配列の途中に添加することができる。

これは効率的ではありませんが、あなたのアイデアを実装することができます。

  1. であると考えているもmention/をご覧ください: 何の関係 間前NP、自然の力で解決NP問題 効率? 選別は O(nlog(n)), な解NP困難です。
  2. の物理法則のオブジェ秋にプロポーションの 重力定数 の質量は無視できます。
  3. を模擬した物理的プロセスに影響を及ぼし、実際の時間が複雑になります。

の分析: (1)球のすべてのセンターは開始時に整列されています (2)より多数==>質量高い==>半径より大きい==>下部地面までの距離 中心のための「真空」と同じ加速度=同じ速度進化==>同じ距離==(3)>どのように以前の球が地面にヒットする方法大きいデ半径... ==>概念的OK、良好な物理的手法であれば、球が地面を打ったとき、それはINDENTIFICATION信号+ヒット時間を送ることができます...ソートされたリストを提供しますウィッヒ 実際に...ない「良い」の数値技術

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top