假设我有一个哈希表arr [1..n],一组密钥k1,k2,k3(密钥数)等等。哈希函数h(k)
h(k)取输入k并将输出i作为arr [i]的索引。
现在在哈希的线性探测概念中,让我们考虑一下场景。
1> let k1=101 and h(k)=i=5, then k1(101) is stored in arr[5]
2> let k2=102 and h(k)=i=6 then k1(102) is stored in arr[6]
3>Now again k3=101 and h(k)=i=5 then by linear probing it will go one
step ahead(i=i+1) and check a[i](a[6]) is free or not, since a[6] is not free
so we repeat again (i=i+1) and check a[i](a[7]) is free or not, since a[7] is free
so k3(101) is again inserted at arr[7].
现在arr [5]和arr [7]可能重复,它们属于同一个键。
hashtable是否允许重复?我的理解是否正确。
如果我错了,请核实我
答案 0 :(得分:6)
在C ++中,有两个哈希容器允许重复。它们是std::unordered_multiset
和std::unordered_multimap
。
答案 1 :(得分:1)
我猜你的问题是你正在实现哈希表。是否允许单个键的多个值取决于您。请注意,这样做会使表格使用起来有点复杂,因为您需要为密钥提供多个值的访问权限。
要禁止重复,在您的示例中的步骤3中,您将比较密钥与插槽5中的密钥,找到它们匹配,然后覆盖条目或拒绝传入条目(您的设计决定)。
答案 2 :(得分:0)
我认为这是一个更复杂的讨论
答案 3 :(得分:0)
有很多不同的哈希表实现。
例如,Microsoft的CAtlMap模板类使用名为“Separate chaining with linked lists”的方法 - 即存储桶完全独立,每个存储桶可以包含多个单个记录。
STL也使用列表。它们只是将所有元素放在索引排序的单个列表中,并且在数组中它们包含2个指向存储桶的第一个和最后一个元素的迭代器。