私は、人々が興味深いと思うかもしれない問題に取り組んできました (そして、おそらく誰かが既存の解決策を知っています)。
オブジェクトへのポインターのペアの長いリストで構成される大きなデータセットがあります。次のようなものです。
[
(a8576, b3295),
(a7856, b2365),
(a3566, b5464),
...
]
一度にメモリに保持するにはオブジェクトが多すぎるため (数百ギガバイトになる可能性があります)、ディスクに格納する必要がありますが、メモリにキャッシュすることができます (おそらく LRU キャッシュを使用)。
すべてのペアを処理するこのリストを実行する必要があります。これには、ペアの両方のオブジェクトをメモリにロードする必要があります (まだキャッシュされていない場合)。
では、質問: リスト内のペアを並べ替えて、メモリ内キャッシュの効果を最大化する (つまり、キャッシュ ミスの数を最小化する) 方法はありますか?
ノート
明らかに、並べ替えアルゴリズムは可能な限り高速である必要があり、リスト全体を一度にメモリに保持できることに依存するべきではありません (そのための十分な RAM がないため)。必要に応じて数回リストします。
ペアではなく個々のオブジェクトを扱っている場合、簡単な答えはそれらをソートすることです。ペアの両方の要素を考慮する必要があるため、これは明らかにこの状況では機能しません。
問題は最小グラフカットを見つけることに関連している可能性がありますが、問題が同等であっても、最小カットを満たす解決策はないと思います
私の仮定では、ヒューリスティックはデータをディスクからストリーミングし、より良い順序でチャンクに書き戻すというものです。これを数回繰り返す必要があるかもしれません。
実際にはペアだけでなく、トリプレット、クアッドレット、またはそれ以上の場合もあります。ペアに対してこれを行うアルゴリズムが簡単に一般化できることを願っています。