【问题标题】:chained hash table keys with universal hasing,does it need a rehash?具有通用哈希的链式哈希表键,是否需要重新哈希?
【发布时间】:2015-11-27 13:33:41
【问题描述】:

我正在使用向量 实现一个链式哈希表。我将向量的大小调整为素数,比如说 5。要选择我使用通用 hasing 的键。

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

【问题讨论】:

  • 如果你有一个大小为 5 的向量,则索引 5 超出范围。
  • 另外,我建议你通过常量引用传递向量,否则每次调用函数时都会复制
  • 向量一开始是空的,我会在运行时插入字符串。为什么5出界?一切都在计算 %5 否?
  • 但是当向量为空的时候调用函数呢?迟早您将在向量的列表中拥有大量数据,如果您按值传递向量,所有数据都将被复制,从而导致大量开销。至于索引问题,向量类似于数组,索引是从零开始的,这意味着大小为 5 的向量的有效索引是 04(包括)。是的,模运算符将为您提供正确的结果,但问题中的文本可以解释为您在索引中包含 5
  • 哦,顺便说一句,如果你使用unsigned int,那么你不需要检查负数,如果达到最大unsigned int值,就让值环绕。

标签: c++ hash hashtable universal


【解决方案1】:

是的,你知道。否则对象将位于错误的哈希桶中,当您搜索它们时,您将找不到它们。散列的全部意义在于更快地定位对象——如果对象不在它们应该在的位置,这将不起作用。

顺便说一句,您可能不应该这样做。有些人花了数年时间开发高效的散列算法。尝试自己滚动会导致性能不佳。从 Wikipedia 中关于 linear hashing 的文章开始。

【讨论】:

    【解决方案2】:

    我需要重新散列我的向量吗?

    您的容器可以继续运行而无需重新散列,但搜索、插入和擦除将越来越像普通的 list 而不是散列表:例如,如果您已插入 10,000 个元素,则可以预期每个 @ 987654322@ 在您的 vector 中有大约 2000 个元素,您可能必须搜索所有 2000 个以查看您正在考虑插入的值是否重复,或者找到 erase 的值,或者简单地返回一个 @ 987654325@到。当然,2,000 比 10,000 好,但它与高质量哈希表实现所期望的 O(1) 性能还有很长的路要走。您的非调整大小实现仍然是“O(N)”。

    这是一个错误吗?

    是的,一个基本的。

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2023-03-31
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多