【问题标题】:Uniform hashing functions统一散列函数
【发布时间】:2012-12-12 10:55:02
【问题描述】:

哈希表基础知识: - 即将进行重大测试。我们将不胜感激。

我基本上对键的统一散列有点困惑。

----------------------
| X X X                    <=== Chains; X represents an item in there
----------------------
| X X X                    <=== Multiple X represents collisions
---------------------- 
| 
----------------------
| X X X
----------------------
| X
----------------------
  1. 考虑上述哈希表的情况,其中 M = 5(行数),总长度为 10。我如何知道这是哈希表是否统一哈希?

  2. 如果对一组键进行统一散列,这是否意味着散列表中链内的列表也就是由于冲突而导致的链表具有相同的长度?还是平均数?

  3. 如果对键进行统一散列,这是否意味着此散列表的查找和删除函数是 O(1)(摊销)和 O(n/M) 的纯复杂度,其中 M 是数字总共有多少个连锁店?

  4. 负载因子或 (N/#ofChains) 是否识别散列的均匀性?

我希望你能帮助我解决这些问题。我的教授在课堂上提出了很多概念,而我基本上只是在这里将它们弯曲在一起,当我将这些概念放在一起时我会感到困惑。

我在网上搜索更多关于这个概念的信息,我看到了一组幻灯片,如下所示。如果您可以向我解释第二张幻灯片中与键的统一散列相关的方程式的含义,我将不胜感激。

另外,当他们说“映射到每个插槽的键数相等”时,这是什么意思。是不是说我上面显示的哈希表不是统一哈希的?

谢谢

【问题讨论】:

    标签: c++ c algorithm hashtable big-o


    【解决方案1】:

    幻灯片讨论了所有可能的键值。重要的是要意识到在您的哈希图中,您在任何给定时间都只有一个键子集。不管你的哈希函数有多好,你可能很幸运这些键映射到存储桶,或者你可能不是。

    1) 考虑上述哈希表的情况,其中 M = 5(行数),总长度为 10。我怎么知道这是哈希表是否统一哈希?

    统一哈希是哈希函数的属性,而不是哈希表的属性。因此,仅仅通过查看哈希表的内容,是做不到的。您必须查看哈希函数本身以确定它是否一致。

    2) 如果一个人对一组键进行统一散列,这是否意味着哈希表中链内的列表也就是由于冲突而导致的链表具有相同的长度?还是说平均数。

    意思是平均。

    3) 如果对键进行统一散列,这是否意味着这个散列表的查找和删除函数是 O(1)(摊销)和 O(n/M) 的纯复杂度,其中 M 是链总数。

    除了哈希函数的属性,复杂度还取决于负载因子。如果桶的数量随着元素的数量线性增长,您平均会得到O(1) find 和 remove(只要您适当地摊销重新分桶)。

    【讨论】:

    • 很好的答案!但是,我仍然对您对第一个问题的回答的概念感到困惑。你能给我举个例子吗?它会比你想象的更有益。再次感谢您的回复。编辑:或者换句话说,均匀散列函数的特征是什么?
    • @bluejamesbond:第一张幻灯片给出了统一哈希函数的特征:“映射到每个槽的键的数量是相等的”。因此,如果您获取所有可能的键(散列函数的输入值),并计算每个键的散列,每个散列值将出现相同的次数。
    • @MikeSeymour:案例和观点。但是,这只有一个整数键。如果键是字符串怎么办?人们永远无法知道最大或最小密钥。因此,您永远无法知道可能进入插槽的密钥数量。这可能是一个非常愚蠢的问题,但你还能解释一下吗?谢谢。
    • @bluejamesbond:第二张幻灯片中的示例(使用模运算或异或运算添加所有字符)为字符串提供了统一的哈希值。即使您无法枚举所有输入值,也很容易证明哈希是均匀分布的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多