【问题标题】:Hash-table - Mapping a hash value to an index哈希表 - 将哈希值映射到索引
【发布时间】:2013-11-23 10:07:06
【问题描述】:

我没有考虑过使用“MOD PRIME”类型的散列函数,对如何使用返回的散列值在 HashMap 中存储值感到有些困惑。

我想实现一个 HashMap,其中的键是 64 位 int(long long int)。我有一个返回 long int 的哈希函数。问题是,使用这个返回的哈希值来确定表索引的最佳方法是什么。因为我的表明显会小于hash值的范围。

是否有任何选择最佳桌子大小的指南?还是将哈希值映射到表大小的最佳方式?

谢谢。

【问题讨论】:

    标签: hashmap hashtable


    【解决方案1】:

    您需要在某些时候调整表格的大小。根据您使用的方法,您将需要在调整大小和复制操作期间重新散列所有键,或者使用某种形式的dynamic hashing,例如extendible hashinglinear hashing

    至于回答问题的第一部分,由于您使用素数作为模数,您应该能够只使用哈希值模表大小来获取索引(对于 64 位 int 和大小为 2^16 的表,这只是 64 位哈希的 16 个最低有效位)。至于表大小,您选择一个足够大的大小来容纳所有数据以及一些备用空间(实际使用值 0.75 负载)。如果您期望有很多插入,则需要提供更多的空间,否则您将一直在调整表格的大小。请注意,对于上面提到的动态哈希算法,这不是必需的,因为所有调整大小的操作都会随着时间的推移而摊销。

    另外,请记住,两个项目可以存储在同一个桶中(在哈希表中的相同哈希位置),哈希函数merely tells you where to start looking。因此,在实践中,您将在哈希表的每个位置都有一个条目数组。请注意,如果您使用open addressing 处理哈希冲突,则可以避免这种情况。

    当然,有时选择不同的哈希函数会做得更好。您的目标是使用dynamic perfect hashinguniversal hashing 之类的东西为您的表格的每个大小设置一个perfect hash function(如果您允许在调整大小时重新散列)。

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多