3

私はすべてのハッシュのニーズに TBucketList と TObjectBucketList を使用してきましたが、バケットの数を切り替えたことはありません。これがデータ構造クラスから何を意味するかを漠然と覚えていますが、誰かがDelphiのこの特定のクラスのニュアンスについて詳しく説明できましたか?

次の表に、可能な値を示します。

値 バケット数

bl2 2
bl4 4
bl8 8
bl16 16
bl32 32
bl64 64
bl128 128
bl256 256
4

1 に答える 1

6

TBucketListポインタをTObjectBucketList格納します。彼らが使用するハッシュ関数は、アドレスの上位ビットを単純にマスクします。マスクされるビットの数は、オブジェクトが持つバケットの数によって異なります。たとえば、を使用するbl2と、31 ビットがマスクされ、アドレスの 1 ビットのみがバケットを決定します。ではbl256、ポインタのバイト全体が使用されます。中間の 2 バイトの 1 つです。トレードオフは、単にバケットの数です。バケットは 8 バイトしか使用しないため、256 バイトあっても大きなコストにはなりません。

それ以外はTBucketList、データ構造クラスで学んだような普通のハッシュ テーブルです。

TIntegerBucketList他と同じハッシュ関数を使用します。より洗練されたハッシュ関数が必要な場合は、メソッドの子孫を記述してTCustomBucketListオーバーライドしますBucketFor。子孫クラスでは、保護されたBucketCountプロパティを割り当てて、 によって提供されるカウント以外のものを使用することもできますTBucketList。バケット カウントの変更により、クラスはアイテムを再配布する努力をしないことに注意してください。そのため、BucketCount自分で再配布を行う予定がない限り、アイテムがリストに追加された後に再割り当てしないでください。

于 2009-02-14T01:08:58.033 に答える