提案の前にトレードオフを考えてみましょう。
「何百万もの」パスを保存する必要があると言います。計算が簡単になるので、100 万と仮定します (サーバー上でさえ、100 万を超えるディレクトリは見たことがありません)。
それらのパスの長さはどれくらいですか? 非常に短いパスの例を示したので、それらの百万のパスを格納するためにおそらく 100 メガバイトを検討しています。パスの最大長についての参考文献はありませんが、256 文字が頭に浮かびます。したがって、パスは最大 512 Mb のメモリを必要とします。そんなに記憶あるの?
パス名はどの程度均等に分散されていますか? つまり、パスの 80% がディレクトリの 20% にあるという 80:20 のルールに従っていますか? 私が尋ねる理由は、トライ構造がレベル間に何らかの形式のインデックスを必要とするからです。ディレクトリの下にいくつかのパスしかない多くのディレクトリがある場合、トライを維持するために多くのオーバーヘッドが発生します。
推奨事項: 十分なメモリがあれば、aHashSet<String>
を使用して、それで完了します。
大量のメモリがなく、ディレクトリ構造が 80:20 ルール (または、より可能性が高いのは 95:5) に従っていない場合は、HashMap<String,Set<String>>
. このマップのキーは、「妥当な」量の重複がある最長の先頭パス文字列であり、値は残りの文字列になります。一致するものが見つかるまで、このマップを徐々に短くする主要コンポーネントでプローブし、次に残りのセットをプローブします。
そのため、「合理的な」複製の問題は未解決のままです。これは、2 ピースのデータ構造のオーバーヘッドが重複の削減によって克服される重複の量です。たとえば、/usr/bin/
有効な場合があります (数千のファイルを保持し、それぞれから 9 文字または 18 バイトを節約するため) が、/usr/local/bin/
おそらくそうではないでしょう (少なくとも私のシステムでは、単一のファイルしか保持しません)。