私は3つのファイルを持っています。F1、F2、F3。F1 は、200K エントリを持つプライマリ ファイルです。F2 と F3 には、エントリのスーパーセットまたはサブセット (300K または 100K) を含めることができます。私の目標は、F2 と F3 にはない F1 のエントリのリストに到達することです。これが私がこれまでに実装した方法です。
- F1 エントリを C++ STL マップにロードします。
- F2 の読み取りを開始します。エントリが一致する場合は、カウントを減らします (マップから消去しません)。カウント = 開始する F1 のサイズ。カウントが 0 の場合、F1 のすべてのエントリが既に F2 にあることがわかり、F2 をさらにトラバースしたり、F3 をトラバースしたりする必要はありません。
- マップからエントリを「消去」していない理由は、C++ STL マップがバイナリ ツリーであることを確認したからです。私のエントリを見ると、私のツリーがバランスのとれた二分木になることは絶対にありません。とても奥の深い木です。そのため、消去操作は高価であることが判明しています。検索操作もおそらくコストがかかりますが、消去操作では、削除するたびにツリーを再作成する必要があります。
- 問題は、F2 に存在するエントリのリストにどのように到達するかです。ブール値フラグ「found = true or false」を持つ構造体を維持する必要がありますか? F2 と F3 を使用した後、STL マップ全体を逆にたどって、= false が見つかった値を検索し、デルタをファイルに書き込み始めますか?
これを行うためのスマートで効率的な方法はありますか?