の一連の 40 億個の 32 ビット整数から欠落している数を見つける問題について読んでいましたProgramming Pearls
が、解決策を完全に得ることができませんでした。
ランダムな順序で最大 40 億個の 32 ビット整数を含むシーケンシャル ファイルが与えられた場合、ファイルにない 32 ビット整数を見つけます。
制約: 数百バイトのメイン メモリが必要ですが、ディスク上の外部スクラッチ ファイルを十分に使用できます。
説明されている解決策は、上位ビットを使用して範囲内の数値を分離するプロセスです (つまり、最初のパスでは、先行0
ビットを持つものを 1 つのファイルに書き込み、先行ビットを持つものを別のファイルに書き込みます1
。2 番目のビットなどを使用して続行します。 )、範囲内の数字の半分未満を含む半分を新しい検索範囲として使用して半分に分割します。
私はグーグルで検索して、 SOで同様の投稿を見つけましたが、これは正確な数がどのように見つかるかという私の質問に完全には答えていません(バイナリ検索がどのように範囲に収まるかわかりません)。
@Damien_The_Unbeliever の回答が最も関連性が高いようですが、私の観点からは、プロセスに従うと 2 つのファイルになると思いました。範囲内に 2 つの数値を持つファイルと 1 つの数値を持つファイルです。
1 つのファイル内の (1 つの) 数値を他の最大の数値で減算することにより、不足している数値を取得できます (ビットマスクは必要ありません。また、範囲がどの時点でも不明であるため、実際にビットマスクを適用できるかどうかはよくわかりません)。
私はこれで間違っていますか?誰かがこれを理解するのを助けることができますか?