3

我一直在使用 TBucketList 和 TObjectBucketList 来满足我所有的散列需求,但从未尝试过切换存储桶的数量。我依稀记得这对 Data Structures 类意味着什么,但有人可以详细说明 Delphi 中这个特定类的细微差别吗

下表列出了可能的值:

值 桶数

BL2 2
BL4 4
BL8 8
bl16 16
BL32 32
BL64 64
BL128 128
BL256 256
4

1 回答 1

6

TBucketListTObjectBucketList存储指针。他们使用的散列函数只是掩盖了地址的高位。有多少位被屏蔽取决于对象有多少桶。例如,如果您使用bl231 位被屏蔽掉,并且只有一位地址确定存储桶。使用bl256时,将使用指针的整个字节。它是中间两个字节之一。权衡只是您将拥有的存储桶数量。一个桶只需要 8 个字节,因此拥有 256 个字节并不是很大的成本。

除此之外,TBucketList它只是一个普通的哈希表,就像您在数据结构类中了解的那样。

TIntegerBucketList使用与其他相同的哈希函数。如果您想要一个更复杂的哈希函数,请编写该方法的后代TCustomBucketList并覆盖该BucketFor方法。在您的后代类中,您还可以分配受保护的BucketCount属性以使用除TBucketList. 请注意,由于存储桶计数的变化,该类不会重新分配项目,因此BucketCount除非您计划自己重新分配,否则不要在项目已添加到列表后重新分配。

于 2009-02-14T01:08:58.033 回答