具有通用哈希的链式哈希表键,是否需要重新哈希?

时间:2015-09-02 06:56:46

标签: c++ hash hashtable universal

我正在使用向量<实现链式哈希表。列表>。我将我的矢量调整为素数,让我们说5.选择我正在使用通用符号的键。

我的问题是,我需要重新渲染我的矢量吗?我的意思是这段代码将始终生成一个介于0和5之间的键,因为它取决于我的哈希表的大小,当然会导致冲突,但新的字符串将全部添加到向量中每个位置的列表中...所以我似乎不需要调整整个事情的大小/重新整理。你怎么看?这是一个错误吗?

2 个答案:

答案 0 :(得分:0)

是的,你这样做。否则,对象将位于错误的哈希桶中,当您搜索它们时,您将无法找到它们。散列的重点是使对象更快地定位 - 如果对象不属于他们应该在的位置,则不会起作用。

顺便说一下,你可能不应该这样做。有些人花了数年时间开发有效的哈希算法。试图自己动手会导致性能不佳。从维基百科中的linear hashing上的文章开始。

答案 1 :(得分:0)

  

我需要重新渲染我的矢量吗?

您的容器可以继续运行而无需重新散列,但搜索,插入和擦除将执行越来越像普通list而不是哈希表:例如,如果您插入10,000个元素,您可以预期list中的每个vector都有2000个元素,你可能需要搜索所有2000个以查看你正在考虑插入的值是否重复,或者找到{{1}的值或者只是返回一个erase。当然,2,000优于10,000,但距离优质哈希表实现的O(1)性能还有很长的路要走。您的非调整大小的实现仍然是“O(N)”。

  

这是一个错误吗?

是的,是一个基本的。