【问题标题】:Why is a successful search in a chained hash table have a time complexity of Θ(1+(n/m)) on average?为什么在链式哈希表中成功搜索的平均时间复杂度为 Θ(1+(n/m))?
【发布时间】:2014-11-10 01:29:06
【问题描述】:

我明白为什么在链式哈希表中不成功的搜索平均具有 Θ(1+(n/m)) 的时间复杂度,因为在不成功的搜索中检查的预期元素数是 (n/m),所需的总时间(包括计算 hashFunction(key) 的时间)为 Θ(1+(n/m))。但为什么搜索成功却是一样的呢?

【问题讨论】:

  • 你问的是1吗?答案就在你的问题中。

标签: algorithm search hashtable time-complexity big-theta


【解决方案1】:

根据 Cormen 等人的“算法:设计与分析”。在具有单独链接冲突解决方案的哈希表中成功搜索期间的预期键比较数为 1 + α/2 - α/2n [其中 α=n/m]。直观的解释:由于这是一个成功的搜索,我们至少检查一个键(我们搜索它),以及链中其余键的一半。

时间复杂度:Θ(1 + 1 + α/2 - α/2n) = Θ(1 + α),根据 big-theta 符号的定义。

【讨论】:

    【解决方案2】:

    成功搜索

    注解:α= n/m = 负载系数

    A) 数学证明

    1)假设在链表末尾插入了一个新元素 ?

    2)插入第i个元素后,列表的预期长度为(i-1)/m ?

    3)在成功搜索的情况下,预期检查的元素数量比插入搜索元素时检查的元素数量多 1!

    因此检查的预期元素数量为

    Calculation of expected time for successful search

    现在加“1”表示计算哈希函数的时间

    我们得到,

    Final Answer

    B)直觉 为了成功搜索,您将计算散列函数 O(1) 并平均遍历链中一半的键

    【讨论】:

    【解决方案3】:

    在绝对条件下成功和不成功搜索的总时间不相等。只有当我们谈到渐近符号时,它们才相等。

    成功搜索的总时间等于 1 + 所需键之前链表中的元素数。 然后这个问题归结为找到在链表中添加特定键后将添加的平均元素数。

    假设要搜索密钥 k1。最初在准备表格时,在 T[h(k1)] 的开头添加了 k1。 设键为 k1 的元素相加后的元素个数为 x。因此,我们仍有 (n-x) 个元素要添加到表中。

    由于这个 x 值可能是 1 到 n(因为键 k1 将始终在表中),所以我们将 (nx) 从 1 到 n 相加,并将其乘以进入键 k1 所在的同一索引的概率添加。 P(h(任意键) = 1/m

    因此平均值为: 1 + {(1/n) (求和 (1/m)(n-x))}

    x 的下限和上限分别为 1 和 n。 结果是 Theta(1 + n/m)。

    【讨论】:

    • 你给出了一个绝妙的解释!太感谢了!我唯一没有得到的是你为什么将求和的结果除以1/n
    【解决方案4】:

    在链式中成功搜索的时间复杂度为 O(1 + n/m) 而不是 Θ(1+(n/m),因为如果你找到了你的元素,你就可以停下来。没有必要看剩下的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 2015-06-10
      • 2022-01-09
      • 2013-06-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多