哈希表是否允许重复值?

时间:2013-11-20 12:27:39

标签: c++ algorithm hashtable

假设我有一个哈希表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是否允许重复?我的理解是否正确。

如果我错了,请核实我

4 个答案:

答案 0 :(得分:6)

在C ++中,有两个哈希容器允许重复。它们是std::unordered_multisetstd::unordered_multimap

答案 1 :(得分:1)

我猜你的问题是你正在实现哈希表。是否允许单个键的多个值取决于您。请注意,这样做会使表格使用起来有点复杂,因为您需要为密钥提供多个值的访问权限。

要禁止重复,在您的示例中的步骤3中,您将比较密钥与插槽5中的密钥,找到它们匹配,然后覆盖条目或拒绝传入条目(您的设计决定)。

答案 2 :(得分:0)

我认为这是一个更复杂的讨论

  1. 散列对可以具有相同的键(散列函数结果),而不具有相同的值,如果实现散列以解决冲突,这可以起作用(通常通过添加列表来完成,类似于您所说的。而不是一个元素,你有一个列表,你需要一些附加的逻辑来确定要采取的元素。
  2. 我知道的哈希表实现不允许重复,因为它不会出现问题。为什么要存储一个元素两次,因为你可以无限次地访问同一个元素。

答案 3 :(得分:0)

有很多不同的哈希表实现。

例如,Microsoft的CAtlMap模板类使用名为“Separate chaining with linked lists”的方法 - 即存储桶完全独立,每个存储桶可以包含多个单个记录。

STL也使用列表。它们只是将所有元素放在索引排序的单个列表中,并且在数组中它们包含2个指向存储桶的第一个和最后一个元素的迭代器。