【问题标题】:How to implement hash function in Java?如何在 Java 中实现哈希函数?
【发布时间】:2011-01-19 02:44:47
【问题描述】:

我使用了一个数组作为哈希表来对值进行哈希算法:

int[] arr={4 , 5 , 64 ,432 };

数组中连续整数的键为:

int keys[]={ 1 , 2 , 3 ,4};

谁能告诉我,将这些整数键映射到这些数组位置的好方法是什么?以下是一种简短且更好的方法,很少或没有碰撞(或更大的值)?

 keys[i] % arrlength  // where i is for different element of an array

提前致谢。

【问题讨论】:

  • 你能添加一些代码来演示你需要使用它吗?
  • 我需要了解哈希算法才能在我的 java 程序中使用它,我在帖子中添加的任何信息都可能是错误的。

标签: java algorithm hash


【解决方案1】:

给自己买一本关于算法和数据结构的书,并阅读关于哈希表的章节(Wikipedia article 也是一个很好的切入点)。这是一个复杂的话题,远远超出了像这样的问答网站的范围。

对于初学者来说,使用数组大小​​取模通常是一个可怕散列函数,因为当值是数组大小的倍数或其除数之一时,它会导致大量冲突。这有多糟糕取决于数组大小:它的除数越多,冲突的可能性就越大;当它是一个素数时,它还不错(但也不是很好)。

【讨论】:

    【解决方案2】:

    有什么理由不使用内置的HashMap 吗?不过,您必须使用 Integer,而不是 int。

     java.util.Map myMap = new java.util.HashMap<Integer, Integer>();
    

    既然你想实现你自己的,那么首先通过阅读Wikipedia article来复习哈希表。之后,你可以学习HashMap source code

    This StackOverflow question 包含用于实现快速哈希映射的有趣链接(尽管适用于 C++),this one(适用于 Java)也是如此。

    【讨论】:

    • 我知道内置类,但我尝试构建自己的类用于学习和实用目的。
    【解决方案3】:

    我假设您正在尝试实现某种哈希表作为练习。否则,您应该只使用 java.util.HashMap 或 java.util.HashTree 或类似的。

    对于一小组值,如您在上面给出的,您的解决方案很好。当您的数据变得更大时,真正的问题就会出现。

    您已经确定碰撞是不可取的 - 这是真的。有时,可能的键的一些知识可以帮助您设计一个好的散列函数。有时,您可以假设键类将具有良好的hash() 方法。由于 hash() 是 Object 定义的方法,所以每个类都实现了它。最好能够利用密钥的 hash() 方法,而不必专门为您的地图构建新算法。

    如果所有整数键的可能性相同,则 mod 函数会将它们均匀地分布在不同的桶中,从而最大限度地减少冲突。但是,如果您知道键将被连续编号,则使用 List 可能比使用 HashMap 更好 - 这将保证不会发生冲突。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 2010-09-06
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2015-07-06
      • 2021-09-14
      相关资源
      最近更新 更多