レイテンシスパイクやハッシュ衝突攻撃からデータ構造を保護する必要がある場合は、バランスの取れたBSTが推奨されます。
前者は、配列に裏打ちされた構造が大きくなり、サイズが変更されたときに発生します。後者は、無限空間から限られた整数範囲への射影としてのハッシュアルゴリズムの必然的な特性です。
.NETのもう1つの問題は、LOHがあり、十分に大きな辞書を使用すると、LOHの断片化に遭遇することです。この場合、BSTを使用して、より大きなアルゴリズムの複雑さのクラスの代償を払うことができます。
つまり、割り当てヒープに裏打ちされたBSTを使用すると、最悪の場合のO(log(N))時間が得られ、ハッシュテーブルを使用すると、最悪の場合のO(N)時間が得られます。
BSTは、平均時間O(log(N))、キャッシュの局所性の低下、ヒープ割り当ての増加という代償を伴いますが、遅延が保証されており、辞書攻撃やメモリの断片化から保護されています。
BSTは、圧縮ガベージコレクターを使用せずに、他のプラットフォームでもメモリの断片化の影響を受けることに注意してください。
メモリサイズに関しては、.NET Dictionary`2クラスは、値とオフセット情報のみを格納するオフヒープリンクリストとしてデータを格納するため、メモリ効率が高くなります。BSTは、オブジェクトヘッダー(各ノードはヒープ上のクラスインスタンスであるため)、2つのポインター、およびバランスの取れたツリー用の拡張ツリーデータを格納する必要があります。たとえば、赤黒木には、色(赤または黒)として解釈されるブール値が必要です。私が間違っていなければ、これは少なくとも6つのマシンワードです。したがって、64ビットシステムの赤黒木にある各ノードは、最小で次のようになります。
ヘッダーの3ワード=24バイト子ポインターの2ワード=16バイト色の1ワード=8バイト値の少なくとも1ワード8+バイト=24+ 16 + 8 + 8 = 56バイト(+8バイトツリーが親ノードポインタを使用している場合)。
同時に、辞書エントリの最小サイズはわずか16バイトになります。