我正在尝试实现一个通用的 HashTable。(这个问题是这里提出的问题的延续)
我已经为表大小固定的情况实现了通用哈希函数。但是,在实时情况下,使用大小最初固定为大约 2^32 位的 HashTable 是一个非常糟糕的主意,因为它可能会导致大量内存浪费。
所以,我现在要做的是动态增加 hast 表的大小,从某个初始值开始,只要它已满。
但是,当我这样做时,散列函数现在会将新值返回给先前散列的键。
除了用新的值重新散列以前散列的值之外,还有什么办法可以克服这个问题。
我正在尝试实现一个通用的 HashTable。(这个问题是这里提出的问题的延续)
我已经为表大小固定的情况实现了通用哈希函数。但是,在实时情况下,使用大小最初固定为大约 2^32 位的 HashTable 是一个非常糟糕的主意,因为它可能会导致大量内存浪费。
所以,我现在要做的是动态增加 hast 表的大小,从某个初始值开始,只要它已满。
但是,当我这样做时,散列函数现在会将新值返回给先前散列的键。
除了用新的值重新散列以前散列的值之外,还有什么办法可以克服这个问题。
您无法避免重新散列:元素最终在哈希表中的位置取决于两三件事,具体取决于您的冲突解决策略:
如果你改变了这三个因素中的任何一个,你需要一个完整的rehash:除非你做了一些非常糟糕的事情,比如选择一个非主表大小,hashCode % tableSize
当你改变时,决定位置的表达式的值将会不同。tableSize
. 在线性探测中散列到同一桶的元素的存在或不存在也将发生变化。这就是为什么你需要一个完整的重新哈希。