【问题标题】:Hashtables and dealing with collisions哈希表和处理冲突
【发布时间】:2011-05-23 10:57:31
【问题描述】:

假设一个哈希表表示为一个大小为 7 的数组。我们想要存储由三个数字组成的字符串。主散列键是第二位模7的数值。辅助散列键是第三位模4加一的数值。将以下字符串插入到最初为空的哈希表中:“111”、“222”、“737”、“323”和“234”。

我的回答:

  • 0 - 234
  • 1 - 111
  • 2 - 222
  • 3 - 737
  • 4 - 323
  • 5-
  • 6 -

  • 111; 1 模 7 = 1

  • 222; 2 模 7 = 2
  • 737; 3 模 7 = 3
  • 323; 3 模 4 + 1 = 4
  • 234; 4 模 4 + 1 = 4 (0)

对吗?

【问题讨论】:

    标签: hashtable


    【解决方案1】:

    您可能想提及您使用的哈希类型。根据您的描述,我假设它是cuckoo hashing。如果是这种情况,您在最后一次插入之前都可以。在插入 234 之前,您有:

    0:
    1: 111
    2: 222
    3: 737
    4: 323
    5:
    6:
    

    尝试用h1 插入234 得到3 mod 7 = 3 的键,但3 已经包含373。继续h2 我们得到4 mod 4 + 1 = 1 但1 已经包含111。此时没有更多的哈希函数,所以我们在 1 处插入 234 并重新散列 111。

    0:
    1: 234
    2: 222
    3: 737
    4: 323
    5:
    6:
    

    h1 哈希111 再次得到1,h2 得到1 mod 4 + 1 = 2,但是2 已经包含222,所以我们将111 存储在2 并重新哈希222,等等。在这种情况下,最终你会找到所有的键合身。如果它们的条目不完全适合(即重新插入进入无限循环),则需要调整表的大小并使用新的散列函数重新散列。

    【讨论】:

      【解决方案2】:

      如果在检查辅助哈希键后仍然存在冲突,我不确定这个问题要你做什么,但我认为它是这样的:

      • 111: 1 模 7 = 1
      • 222: 2 模 7 = 2
      • 737:3 模 7 = 3
      • 323:2 mod 7 = 2 => 碰撞:3 mod 4 + 1 = 3 + 1 = 4
      • 234:3 mod 7 = 3 => 碰撞:4 mod 4 + 1 = 0 + 1 = 1 => 碰撞

      如果你在第二次碰撞后前进一格,结果将是

      • 0 -
      • 1 - 111
      • 2 - 222
      • 3 - 737
      • 4 - 323
      • 5 - 234
      • 6 -
      • 7 -

      【讨论】:

        猜你喜欢
        • 2013-09-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2011-02-17
        • 2017-06-25
        • 2021-12-18
        • 2011-06-24
        相关资源
        最近更新 更多