哈希表在相同或碰撞值上的线性关系如何?

时间:2018-04-16 08:14:35

标签: hash hashmap hashtable linear-probing

我正在查看this StackOverflow回答以更好地理解哈希并看到以下内容(关于我们需要在恒定时间内获取桶大小的事实):

如果你使用线性探测或双重散列之类的东西,找到散列到相同值的所有项目意味着你需要散列值,然后遍历"链接"表中的非空项目,以查找有多少哈希值相同的值。但是,对于散列到相同值的项目数量,它不是线性的 - 它与散列到相同或冲突值的项目数量呈线性关系。

这是什么意思,它对于散列到相同或相反值的物品数量呈线性关系?"?它不会与散列表中的项目总数呈线性关系,因为它可能需要在线性探测期间遍历每个值吗?我不明白为什么它必须经历碰撞的那些。

例如,如果我在哈希表上使用线性探测(步长1)并且我有不同的键(不冲突,所有哈希到唯一值)映射到奇数索引槽1,3,5,7,9.....然后,我想要插入所有散列为2的键,所以我用这些键填充所有偶数索引点。如果我想知道有多少键哈希到2,那么我不需要遍历整个哈希表吗?但是,我不仅仅是迭代到具有相同或碰撞值的项目,因为奇数索引槽不会发生冲突。

1 个答案:

答案 0 :(得分:1)

哈希表在概念上类似于链表的数组(表)(表中的 bucket )。区别在于您如何管理和访问该数组:使用函数生成用于计算数组索引的数字。

一旦你有两个元素放在同一个桶中(相同的计算值,即collission),那么问题就变成了列表中的搜索。希望列表中元素的数量低于哈希表中的总元素数(意味着其他元素中存在其他元素)。

但是,您正在跳过该段中的重要介绍:

  

如果你使用线性探测或双重散列之类的东西,找到散列到相同值的所有项目意味着你需要散列值,然后遍历&#34;链&#34 ;表中的非空项目,以查找有多少哈希值相同的值。但是,对于散列到相同值的项目数而言,这并不是线性的 - 它与散列到相同或冲突值的项目数呈线性关系。< / p>

Linear probing是哈希表的一种不同实现,您不会在其中使用任何列表(链)进行捕获。相反,您只需从预期位置开始,然后向前找到阵列中最近的可用点。数组越多,找到下一个位置的机会就越高,所以你只需要继续搜索。这些位置由项目使用,这些项目具有相同或相互冲突的值,尽管您从未(并且您并不关心)这两种情况中的哪一种,除非您明确地看到哈希那里现有的元素。

This CppCon presentation video对哈希表进行了很好的介绍和深入分析。