効率的な文字列トライの実装を探しています。ほとんどの場合、次のようなコードが見つかりました。
これらの実装は、主に2つの理由で嫌いです。
- 256文字のASCII文字のみをサポートします。キリル文字などをカバーする必要があります。
- それらは非常にメモリ効率が悪いです。
各ノードには、256個の参照の配列が含まれます。これは、Javaの64ビットマシンでは4096バイトです。これらの各ノードは、それぞれ4096バイトの参照を持つ最大256個のサブノードを持つことができます。したがって、すべてのASCII 2文字列の完全なトライには1MBを少し超えるサイズが必要です。3つの文字列?ノード内の配列にのみ256MB。等々。
もちろん、トライに1600万の3文字列すべてを含めるつもりはないので、多くのスペースが無駄になっています。これらの配列のほとんどは、挿入されたキーの実際の数をはるかに超える容量があるため、単なるヌル参照です。また、Unicodeを追加すると、配列はさらに大きくなります(charの値はJavaの256ではなく64kです)。
文字列の効率的なトライを作成する希望はありますか?これらのタイプの実装に対するいくつかの改善を検討しました。
- 参照の配列を使用する代わりに、プリミティブ整数型の配列を使用できます。これは、サイズが実際のノードの数に近いノードへの参照の配列にインデックスを付けます。
- 深いツリーを犠牲にしてサイズ16のノード配列を可能にする4ビットの部分に文字列を分割できます。