【问题标题】:Hashing Functions and Hash Tables散列函数和散列表
【发布时间】:2013-12-21 12:58:38
【问题描述】:

假设我们有一组键:。使用散列函数 key % N 将每个键映射到 以下数组。如果发生冲突,请使用单独的链接 技术。

下面是数组的图片,数组标记为A,大小为13,所以图片是列出0-12的数组单元格。 N=13。

到目前为止,我对这个问题的散列的理解是,我需要使用函数key % 13(N 等于 13)将给定的键排列到数组中。但是我的书没有给出不同功能的例子。它使用的唯一示例是使用姓氏的首字母进行字母排序。

谁能给我一个简短的解释而不只是给我答案?

【问题讨论】:

标签: java arrays hash


【解决方案1】:

正如你所说,你的哈希函数是 h=key%13;

假设有一个从地址 0 到 20 的内存位置。 因此,将此函数应用于数组中的每个元素。 1) h1= 54 % 13 = 2 => 这将转到第二个地址位置。

2) h2= 18 % 13 = 5 => 这将转到第 5 个位置。

3) h3= 10 % 13 = 10 => 这将转到第 10 个位置。

4) h4= 25 % 13 = 14 => 这将转到第 14 个位置。

5) h5= 28 % 13 = 2 => 这里发生冲突,因为 54 已经存在于第二个位置。

现在的解决方案是使用分离链。

分离链接意味着只需将此当前元素添加到第二个位置的链接列表中的下一个位置。意味着当发生碰撞时,每个位置都会有一个新的链表。

下面是图片。单独的链接。

希望您得到答案。上图中的元素不同,但效果相同。

欲了解更多详情,请访问此链接:enter link description here

【讨论】:

  • 那个pp解释也很有帮助,谢谢!
【解决方案2】:

您似乎了解将值插入散列的一般过程。您需要做的就是将您的教科书示例与您的家庭作业问题联系起来。

  1. 根据散列函数确定需要将值放入哪个桶。在教科书示例中,散列函数采用姓氏的第一个字母。在您的作业中,散列函数为 N % 13。
  2. 解决任何冲突并执行实际插入。您没有提及您的教科书示例使用什么作为冲突解决策略,但您的作业要求您使用单独的链接。

【讨论】:

  • 那么,取第一个键 54,除以 13,得到的 int(我猜是四舍五入)就是我把那个键放进去的桶?
  • 好吧,你会 % 它,因为这就是作业所说的(如果你要除,那么你应该总是向下舍入,以免自己选择向下舍入还是向上舍入)。但你的想法是对的。
  • 哦等等!抱歉,模数结果是余数。忘记了。
  • 模数是绝对值还是负数?
  • Java 中的模数可以是负数。因此,您可以通过取绝对值或向其添加 N 来处理这种情况。
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 2023-03-23
  • 1970-01-01
  • 2011-03-13
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
相关资源
最近更新 更多