デビルスキーの答えから:
私はあなたの考えを少し適応させます。オブジェクトはありますが、重量は異なりませんが、速度は異なります。したがって、最初はすべてのオブジェクトが開始線と開始ショットで整列され、すべてのオブジェクトがそれぞれの速度で終了まで移動します。
十分にクリア:フィニッシュの最初のオブジェクトは、そこにあることを示す信号を発します。あなたは信号をキャッチし、それが誰であったかを結果用紙に書き込みます
私はそれをさらに単純化して、これらのオブジェクトはランダムな正の整数であると言います。また、ゼロに近づくにつれて昇順で並べ替えたいので、ゼロからの距離d
は最初は整数自体に等しくなります。
シミュレーションが離散時間ステップ、つまりフレームで行われると仮定すると、すべてのフレームで、すべてのオブジェクトの新しい距離は次のようになります。d = d - v
オブジェクトは、そのときにリストに追加されますd ≤ 0
。これは、1つの減算と1つの条件付きです。オブジェクトごとに2つの個別のステップがあるため、計算はO(n):線形のように見えます。
キャッチは、1フレームのみ線形です!終了するのに必要なフレーム数を掛けf
ます。シミュレーション自体はO(nf):2次式です。
ただし、フレームの期間を引数として使用すると、反比例してt
フレーム数に影響を与えることができます。f
増やすt
ことで減らすこともできf
ますが、精度が犠牲になります。増やすほどt
、2つのオブジェクトが同じ時間枠で終了する可能性が高くなります。したがって、そうでない場合でも、同等としてリストされます。したがって、精度を調整できるアルゴリズムを取得します(ほとんどの有限要素シミュレーションコンテキストでそうであるように)
これを適応+再帰アルゴリズムに変えることで、これをさらに洗練することができます。人間のコードでは、次のようになります。
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。上記の擬似コードは私の擬似コードの考え方です。もしあれば、もっと読みやすい、または適合した方法で自由に書き直してください。