【问题标题】:Implementation of hash table using unordered_map in c++ and handling collisions在c ++中使用unordered_map实现哈希表并处理冲突
【发布时间】:2017-02-20 02:24:46
【问题描述】:

如何在 C++ 中使用无序映射实现哈希映射。 如果 unordered map 中的键对应于哈希函数生成的索引, 当有多个值具有相同的键(冲突)时怎么办。那么我们如何使用相同的键访问这些值。

例如

unordered_map <int,string> hashTable;

hashTable.insert(pair<int,string>(3,"ab"))
hashTable.insert(pair<int,string>(3,"ba"))

现在如何访问“ba”?

【问题讨论】:

  • Unordered_map 实际上是一个哈希表。
  • 你可能想用一个更好的例子,因为第二次插入会失败,因为它有相同的键。
  • 这正是我怀疑的@amchacon,因为 unordered_map 中的键必须是唯一的,并且哈希键确实是 unordered_map 的键,那么如何处理任何冲突?跨度>
  • 假设我想为 mod 7 存储数字。所以 6 和 13 有相同的 mod 我必须做 hash.insert(6,6) 和 hash.insert(6,13) .但是,如果我这样做,我如何平均访问 O(1) 中的 13(因为存在冲突)。所以,如果我执行 hash.insert(6,6) 和 hash.insert(13,6) 则不会虽然发生了碰撞,但这意味着我的无序地图将永远无法处理任何碰撞。

标签: c++ hash stl hashmap unordered-map


【解决方案1】:

正如@amchacon 指出的那样,std::unordered_map 已经是一个哈希表。

key 和 hash(key) 是有区别的。在 unordered_map 中,键必须是不同的,而键的散列可能会发生冲突。仔细看看std::unordered_map的模板参数。有Hash,也有KeyEqual。

如果您确实希望多个记录具有相同的键,请改用std::unordered_multimap

【讨论】:

  • 那么 unordered_map 中的值作为它实际实现的哈希表的键,而 unordered_map 的键实际上是我们要存储的?
  • 您必须检查您的数据以查看它是否确实是(键,值)对的集合。例如。如果您有 (int employee_id, string employee_info),您可以将它们存储到 unordered_map 中。通常你不需要担心“哈希表的键”;默认情况下 std::unordered_map 使用 std::hash。另一方面,您可能有一组值。在这种情况下,您可以改用 std::set 。这样,您的问题的答案是否定的; unordered_map 中的值不用作哈希表的键。 std::hash 是。
【解决方案2】:

hashTable[3] 实际上是“ba”。

你可以搜索它。

auto it = hashTable.find(3);
if(it!=hashTable.end()){
   std::cout << "item found" << it->second << "\n";
}else{
   std::cout << "item does not exists in table.";
}

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2015-06-29
    • 2021-12-18
    • 2013-09-01
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多