【问题标题】:Size of an hashed array with pseudorandom hashing method具有伪随机散列方法的散列数组的大小
【发布时间】:2013-05-20 14:45:39
【问题描述】:

我对设置一个良好且有效的散列数组大小感到困惑。我正在阅读的书说负载因子应该在 75% 左右才能成为一个好的散列数组。但是在我实际尝试测试散列数组放置键之前,我不知道如何从理论上确定数组的大小。在达到最佳散列数组大小方面是否有任何线索或关键提示?大小是否取决于您用于散列的方法?

【问题讨论】:

  • 大小不固定...希望你明白。
  • 我认为大小取决于负载因子,而不是您用于散列的方法。至于数组的初始大小,如果您不知道输入的数量,那么只需制作一个小数组并在插入哈希表时对其进行扩展(将其加倍并重新哈希所有内容)。

标签: c data-structures hash


【解决方案1】:

您的哈希表解决方案应该依赖于事先知道要放入表中的元素数量。相反,动态增长和收缩是最好的。

建议使用较小的哈希表大小 (

还应该有大约是增长阈值的 1/2 的收缩阈值。

通过使增长和收缩阈值彼此远离,如果您在临界大小附近添加/删除哈希表元素,您可以避免大量工作。

哈希表大小的另一个好处是它们是质数。典型的散列函数由一些预散列函数组成,比如unsigned Hash(unsigned item),然后使用散列表大小修改结果:BucketIndex = Hash(item)%HashTableSize 如果Hash() 做得不好,一个素数散列表大小可以改善分散性。

对于素值,我建议在您的 Hash 数据结构中保留一个 HashPrime_Index,然后在您需要知道哈希表的大小时使用下表。

static const size_t HashPrime[] = { 0, 2, 3, 7, 13, 31, 61, ... }; // Primes just less than powers of 2.

增长时使用 0, 3, 13, ... 收缩时使用 ..., 61, 13, 2。

当您使用主要哈希表大小时,最佳哈希表大小取决于Hash() 方法。注意:Hash() 应该返回一个大整数。

【讨论】:

    【解决方案2】:

    随着元素数量的增加,您可以重新散列您的哈希表。此过程会更改存储桶的数量。根据细节,这甚至可能是必要的

      1234563容器代表一个桶)。因此,您应该跟踪当前的负载因子(元素数除以存储桶数)并在它变得太大时增大表。
    • 如果您使用探测(“开放寻址”),您必须在探测无法找到新元素的空闲位置时重新散列。

    【讨论】:

    • @nhahtdh:怎么会这样?探测失败怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2011-05-08
    • 1970-01-01
    • 2011-07-24
    • 2012-06-12
    • 2012-09-09
    • 2023-03-11
    相关资源
    最近更新 更多