【问题标题】:How does the universal hash function that randomly generates an integer perform lookup after insertion?随机生成整数的通用哈希函数如何在插入后进行查找?
【发布时间】:2016-05-24 07:58:34
【问题描述】:

以下演示取自 Tim Roughgarden 提供的 Coursera 上的算法:设计和分析视频讲座(顺便说一句,现象解释)。据我了解,此哈希函数有效地返回哈希表中 0 到 n 之间的现有索引位置。但是,当a(下图)是一个随机整数时,如何对这种独特的计算进行逆向工程以进行恒定时间查找,这让我感到困惑。

Let U = IP addresses (of the form (x1, x2, x3, x4)
                       with each subscript of x in  {0,1,2,...255})
Let n = a prime number
Define one hash function per 4-tuple a = (a1, a2, a3, a4)
                         with each subscript of a in {0, 1, 2,...n-1}
Define: h<sub>a : IP addresses ---> buckets        *n^4 such functions*
by h<sub>a(x1,x2,x3,x4) = (a1x1 + a2x2 + a3x3 + a4x4)

<sub> = subscript notation

然后使用modulo n 计算上述等式以返回哈希表中的位置,该位置对于U 中的任何不同输入具有 1/n 的重复概率。如何使用原始 IP 地址检索该 IP 地址位置?

【问题讨论】:

    标签: algorithm hash hashtable hashcode


    【解决方案1】:

    哈希会丢失信息。所以你不能从散列向后工作到原始。您将原始存储在其哈希给出的索引处;您可以通过查看 H(x) 处的项目是否为 x 来验证某个值 x 在表中。

    当然,如果表中的两个对象具有相同的哈希值(“冲突”),这将不起作用。不同的哈希表算法有不同的策略来处理冲突,对于您的讲师可能正在解释的策略,拥有另一个独立的哈希函数会很有用。

    【讨论】:

    • 让我看看我是否明白这一点。如果查找是检查 H(x) 处的项目是否为 x,那不需要线性时间吗?或者您是说通过不同的哈希函数运行item 并检查x 的返回值的位置可以保证检索,因此我误解了a 的随机性,以便在@987654324 的不同输入上进行模式化计算@?谢谢你的回答,顺便说一句。
    • @Pro:通常,您为表选择单个哈希函数。有时你会选择两个。理论上,你可以使用尽可能多的,所以这里有一个没有人使用的可能的冲突策略:(1)选择(随机但永久)所有通用哈希函数的序列:H1,H2,.. ..(实际上,您并不需要创建序列,您只需要知道如何重新生成它。)要在哈希表中找到 x,请计算哈希 H1(x)、H2(x)、...并查看相应的表条目,直到找到 x 或为空。你的任务:证明预期的探测次数是 N/(N-α)...
    • ... 如果在占用率过高时通过增长哈希表来限制 α,则为 O(1)。
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多