【问题标题】:Hash Table sequence always get inserted哈希表序列总是被插入
【发布时间】:2016-06-26 12:46:42
【问题描述】:

我有一个与哈希表有关的问题。

让我们考虑一个开放线性模式中维度为2^n 的哈希表。

  1. h(k,i) = (k^n + 2*i)mod(2^n)。证明序列 {1,2,...2^n} 总是可以插入到哈希表中。

我试图找出数字插入表格中的模式,然后应用归纳法看看我是否可以证明这个问题。我们老师给我们的任何问题似乎都是这样的,我可以想不出解决这类问题的方法。

【问题讨论】:

  • 您是否在问题陈述中留下“无碰撞”字样?
  • @stark 发生碰撞,但通过线性探测解决。

标签: algorithm hashtable


【解决方案1】:

h(k,i) = (k^n + 2*i)mod(2^n)。证明序列{1,2,...2^n}总是可以插入到哈希表中。

关于哈希函数的两个观察:

  • k^n,对于n >= 1,当k为奇数时为奇数,当k为偶数时为偶数

  • 2*i 将每隔一个桶探测一次(从最后一个循环到第一个)

因此,当您散列 {1,2,...2^n} 时,我们知道您将在查找未使用的奇数索引桶和偶数索引桶之间交替。

为了强调这一点,k^n 位将奇数键限制为奇数索引桶,偶数键限制偶数索引桶,而2*i 确保考虑所有此类桶,直到找到空闲的桶。有必要恰好一半的键是奇数,一半是偶数,这样表才能变满,而h(k,i) 不会因为i 递增而找不到未使用的存储桶。

【讨论】:

    【解决方案2】:

    这里有很多术语问题。

    1. 你的哈希表没有dimensions(实际上有,但它是一维的,而不是2^n),但它有槽/桶的数量。
    2. 您提出的问题很可能不是您的书/老师希望您解决的问题。你说:

    证明序列 {1,2,...2^n} 总是可以插入到 哈希表

    问题是,在您的情况下,任何自然数都可以插入到您的哈希表中。这很明显,因为您的哈希函数将任何数字映射到从 [0 到 2^n) 的区域中的自然数,并且因为您的哈希函数有 2^n 个插槽,所以任何数字都适合您的哈希。


    所以请阐明你的老师想要什么,解释找出你的散列函数中的 k 和 i 是什么,然后问另一个准备得更充分的问题。

    【讨论】:

    • 但是如果哈希函数不是很好的函数,然后在插入操作过程中会出现循环并且永远找不到空槽?
    • @Drago,如果被禁止,您在问题中的哪个位置说这个?在任何正常的散列中,一个键应该有超过 1 个值?
    • 基本上我需要证明,即使发生碰撞,根据给定的公式,总会找到一个空槽。
    • 这里是链接webdocs.cs.ualberta.ca/~holte/T26/open-addr.html,描述了使用线性探测的开放寻址。
    猜你喜欢
    • 2015-06-25
    • 2017-03-28
    • 1970-01-01
    • 2015-06-10
    • 2014-11-01
    • 2013-03-16
    • 2021-10-02
    • 2019-06-10
    相关资源
    最近更新 更多