java - 线性探测哈希表中数组 M 的大小应该有多大?

标签 java hash hashtable

我试图理解使用 Java 的线性探测哈希表的实现。然而,我对为什么 M 的初始值被赋予 30001 感到沮丧。代码的骨架如下。

    public class LinearProbingHashTable<Key, Value>{
      private int M = 30001;
      private Value[] vals = (Value[]) new Object[M];
      private Key[] keys = (Key[]) new Object[M];

      private int hash(Key key){...}
      public void put(Key key, Value val){...}
      public Value get(Key key){...}
    }

我的问题是为什么M在这里初始化为30001。这是经验法则吗?初始化线性探测哈希表时如何确定M的大小?

最佳答案

您必须知道这部分代码的用途,才能更好地理解这一点。也许,或者很可能,键在 [0, 30000] 范围内。

<小时/>

进一步阅读:

  1. [1] [2] 选择合适的 HashTableSize 对于该方法的成功非常重要。例如,HashTableSize 为 2 将为偶数 Key 生成偶数哈希值,为奇数 Key 生成奇数哈希值。这是一个不受欢迎的属性,因为如果所有键碰巧是偶数,它们都会散列到相同的值。如果 HashTableSize 是 2 的幂,则哈希函数只需选择 Key 位的子集作为表索引。为了获得更随机的散射,HashTableSize 应该是一个不太接近 2 的幂的素数。

  2. 查看[3]关于如何为哈希选择合适的表大小。

关于java - 线性探测哈希表中数组 M 的大小应该有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774220/

相关文章:

java - 如何在Java中以树形结构显示列表数据?

android - SHA-256 哈希在 Android 中产生错误的结果

python - 类型错误 : a float is required in sklearn. feature_extraction.FeatureHasher

java - 查找桶中有多少个键

java - 在 Hashmap 的 Hashmap 中查找最大值

java - 测试从数据库插入、更新和删除的类

java - 断言 Optional 具有一定的值(value)

java - Struts 2 "<s:if>"标签无法按预期工作

ruby-on-rails - rails : Remove element from array of hashes

java - 难以理解链式哈希表的实现