この効率的なソリューションについて、次の 2 つの仮定を立てました。
- line に相当する Blob があるか、バイナリとして処理できます
- 各行の先頭へのオフセットまたはポインターを保存できます。
これらの仮定に基づく解決策は次のとおりです。 1. 行を読み取り、ハッシュマップの長さを key として保存します。キーで指定された長さを持つすべての行について、ハッシュマップのエントリとしてリストを保存します。このハッシュマップを構築するのは O(n) です。ハッシュマップ内の各行のオフセットをマッピングする際に、エントリ -1 をオフセットとして除いて、このキーの長さの行 (オフセット) のリスト内のすべての既存のエントリと行ブロブを比較します。重複が見つかった場合は、両方の行を削除してオフセットを保存します -リスト内のそれらの場所で 1 です。
したがって、複雑さとメモリ使用量を考慮してください。
ハッシュマップ メモリ、スペースの複雑さ = O(n) n は行数
時間の複雑さ - 重複はなく、各行の長さ = m を考慮してすべての行の長さが等しい場合、行数 = n を考慮すると、O(n) になります。blob を比較できると仮定しているので、 m は問題ではありません。それは最悪のケースでした。
ハッシュマップに必要な余分なスペースはほとんどありませんが、比較を節約する場合もあります。
さらに、サーバー側で mapreduce を使用して、セットを分割し、後で結果をマージできます。長さまたは行頭をマッパーキーとして使用します。