問題
A と B という名前の間隔の 2 つのコレクションがあるとします。どのようにすれば、最も時間効率とメモリ効率の高い方法で差 (相対的補数) を見つけることができるでしょうか?
説明用の画像:
区間終点は整数( ≤ 2 128 -1 ) であり、常に 2 nの長さで、m×2 n格子上に配置されます (したがって、それらから二分木を作成できます)。
間隔は入力でオーバーラップできますが、これは出力には影響しません (平坦化された場合の結果は同じになります)。
問題は、両方のコレクションに多くの間隔 (最大 100,000,000) があるため、単純な実装はおそらく遅くなるということです。
入力は 2 つのファイルから読み取られ、小さなサブ間隔 (重複している場合) がサイズ順に親の直後になるように並べ替えられます。例えば:
[0,7]
[0,3]
[4,7]
[4,5]
[8,15]
...
私は何を試しましたか?
これまでのところ、私は二分探索木を生成する実装に取り組んできました。その際[0,3],[4,7] => [0,7]
、両方のコレクションから隣接する間隔 (必要に応じて最初のツリーの間隔)。
これは小さなコレクションでは機能しているように見えますが、ツリーへの挿入とツリーからの削除を完了するのに必要な時間は言うまでもなく、ツリー自体を保持するためにより多くの RAM が必要になります。
間隔は事前にソートされているため、動的アルゴリズムを使用して 1 回のパスで終了できると考えました。ただし、これが可能かどうかはわかりません。
では、この問題を効率的に解決するにはどうすればよいでしょうか。
免責事項:これは宿題ではなく、私が直面している実際の現実の問題の修正/一般化です. 私は C++ でプログラミングしていますが、任意の [命令型] 言語のアルゴリズムを受け入れることができます。