统一散列函数

时间:2012-12-12 10:55:02

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

哈希表基础: - 主要测试即将开始。所有帮助都会受到赞赏。

我基本上对按键的均匀散列感到困惑。

----------------------
| 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 / #Chains)是否识别出散列的均匀性?

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

    我正在网上搜索更多有关此概念的研究,我看到了一组幻灯片,如下所示。如果你可以向我解释在第二张幻灯片中关于统一哈希键的方程式意味着什么,我将不得不向你解释

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

    enter image description here

    谢谢

1 个答案:

答案 0 :(得分:2)

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

  

1)考虑上面哈希表的情况,其中M = 5(行数),总长度为10.我怎么知道哈希表是否均匀哈希?

统一散列是散列函数的属性,而不是散列表的属性。因此,只需查看哈希表的内容,就可以了。你必须查看哈希函数本身,以确定它是否统一。

  

2)如果一个人对一组密钥进行统一散列,这是否意味着哈希表中链中的列表(即由于冲突导致的链表)具有相同的长度?或者它是否意味着平均值。

这意味着平均。

  

3)如果一个人对密钥进行统一散列,这是否意味着该散列表的查找和删除功能是O(1)(摊销)和O(n / M)的纯复杂度,其中M是数量连锁店。

除了哈希函数的属性外,复杂性还取决于加载因子。如果存储桶的数量在元素数量上呈线性增长,则会O(1)平均找到并删除(只要您适当地分摊重新分组)。