私は現在、難しいソートの問題に直面しています。相互にソートする必要があるイベントのコレクション (比較ソート) と、リスト内の相対位置に対してソートする必要があります。
簡単に言えば、優先度 (整数)、期間 (秒)、およびイベントがリストに表示される最も早い発生時刻を持つイベントのリストがあります。優先度に基づいてイベントを並べ替える必要がありますが、最も早い発生時間より前にリストに表示されるイベントはありません。(うまくいけば)より明確にするための例を次に示します。
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration = 2.0, earliestTime = 0.0 };
// assume list starts at 0.0 seconds
List<Event> results = Sort( new List<Event> { a, b, c, d } );
assert( results[ 0 ] == a ); // 4.0 seconds elapsed
assert( results[ 1 ] == c ); // 7.0 seconds elapsed
assert( results[ 2 ] == b ); // 12.0 seconds elapsed
assert( results[ 3 ] == d ); // 14.0 seconds elapsed
}
アイテム "b" は、リストの 6.0 秒まで開始できないため、最後に来る必要があります。したがって、アイテムは延期され、"c" は優先度が低くても "b" の前に移動します。(うまくいけば、上記で私の問題が説明されます。そうでない場合は、お知らせください。編集します。)
私の現在の考えは、挿入ソートを使用してソートプロセスを管理することです。他の一般的な並べ替えアルゴリズムの多くとは異なり、挿入並べ替えはリストの順序を一度に 1 つずつ順番に決定します。したがって、インデックスごとに、最も早い発生時間が満たされる次に優先度の低いイベントを見つけることができるはずです。
この「並べ替え」の問題に対する優れたソリューションを設計するのに役立つ、並べ替えアルゴリズムとデータ構造に関するリソースを見つけたいと思っています。私の本当の問題は実際にはこれよりも複雑です: 階層的な並べ替え、イベント間の可変バッファ、複数の一定でない時間の制約など、情報やアイデアが多ければ多いほど良いのです。速度とスペースは実際には問題ではありません。ソートの精度とコードの保守性が懸念されます。
編集:説明(コメントに基づく)
- イベントはその期間全体を消費します (つまり、イベントのオーバーラップは許可されません)。
- イベントは、earlylyTime 以降に発生する必要があり、earlylyTime より前に発生することはできません。
- 優先度の低いイベントが存在する場合、イベントは EarlyTime よりも遅く発生する可能性があります
- イベントは中断できません
- リストに収まるすべてのイベントの合計に最大期間があります。これは上には示されていません。(実際には、すべてのイベントの期間は、タイム リストの最大期間よりもはるかに長くなります。)
- ギャップがあってはなりません。(試して埋め戻す穴はありません。)
編集:答え
David Nehme が私が選択した回答を提供しましたが、彼の回答は本質的に挿入ソートであり、他の何人かが挿入ソート タイプの回答を提供したことを指摘したいと思います。これは、特殊な挿入ソートがおそらく進むべき道であることを私に確認させます。皆様、ご回答ありがとうございます。