现在我的哈希表计算插入哈希表的每个元素的数量。我使用这个计数,使用总哈希表大小来计算负载因子,当它达到70%时,我重新计算它。
我在想,也许我应该只计算插入的元素,填充空槽而不是全部。导致我使用的碰撞方法是单独的链接。因子负载不断增加,但是如果可能存在一些冲突,则在哈希表上留下大量空槽。
你可能在想,如果我遇到那么多碰撞,也许我没有使用最好的散列方法。但这不是重点,我正在使用其中一种已知的哈希算法,我在我的样本数据上测试了其中的3个并选择了产生较少冲突的算法。
我的问题仍然存在。我应该继续计算插入的每个元素,还是只计算填充哈希表中空插槽的元素?
答案 0 :(得分:1)
Rehashing旨在减少碰撞的可能性,因此系统地忽略碰撞以决定何时重新打击似乎会弄巧成拙。
最佳可能是如果你保留每个条目的原始完整哈希值(当然冲突由哈希模块确定当前大小)并且只计算由模运算引起的冲突 - 隐含地承认如果碰撞是由于不同项目的相同完整哈希值引起的,那么没有任何重复可以帮助(除非通过“重新表达”你也意味着切换到不同的哈希函数,但它看起来不像你在这里的意思; - 。)
保持完整的哈希值也意味着更便宜的重新散列,因为你不需要再次运行哈希函数(当然,这取决于你的哈希函数的计算成本有多大)。