如果我有50,000个条目并且说哈希表中有100,000个可用插槽。 如果不使用LinkedLists,那么为每个索引选择合适的桶数组大小的最佳方法是什么,以便数组永远不会“溢出”? 30%的过剩是否合适?
答案 0 :(得分:0)
某些语言支持数组的动态大小(无需声明数组的大小)。 数据动态决定了数组的大小。需要大小的语言也支持动态数组。
答案 1 :(得分:0)
如果您使用固定大小的阵列作为您的桶,那么没有小于50,000的桶大小可以保证永远不会溢出,除非您有关于50,000中密钥分发的其他信息(即如果您知道它们是整数1 ... 50,000然后它将是微不足道的)。
但通常你不想依赖大型桶,因为这是O(n)来搜索桶。相反,使用可变大小的表和可变大小的存储桶更好。存储桶可以简单地为每次填充时尺寸加倍的阵列。同样,每次获得90%的填充时,哈希表的大小可以加倍。这是一种标准类型的方法。
正如之前的海报所提到的,大多数列表实现,无论是通过数组还是链表,都会在列表填满后自动为您重新分配存储空间。
答案 2 :(得分:0)
如果您知道先验键,则可以计算minimal perfect hash。因此,如果您知道密钥并且可以定制散列函数,则桶大小为1就足够了。
如果您事先不知道密钥 - 或者确实知道密钥,但确实无法改变哈希函数 - 那么攻击者可能会选择最坏情况的密钥集(即所有密钥)哈希到同一个桶)。为了保证桶没有溢出,你需要一个桶大小等于桶的数量。如果您愿意容忍溢出的可能性,则可以进行更复杂的分析,以选择涵盖优势情况的铲斗尺寸。