【问题标题】:How does std::unordered_map actually use hash functions?std::unordered_map 实际如何使用哈希函数?
【发布时间】:2021-06-04 20:42:04
【问题描述】:

我不太清楚标准的std::unordered_map 容器如何使用散列。

我对哈希很陌生,现在我正在努力通过我的大学数据结构考试。

我知道,如果我有一个对象集合,我必须按照标准将它们的键尽可能随机分组,以便它们尽可能均匀地分布在某些存储桶中,然后我可以不断地搜索/插入/删除时间通过查看与散列键关联的存储桶(这主要是链式散列所做的,如果我错了,请纠正我)。

但是,std::unordered_map 如何使用散列?它如何使用散列设置一个新的(键,值)对?我的意思是,我知道散列会根据某些标准对键进行分组,但完全不清楚它是如何使用散列设置新的(键、值)对的。

【问题讨论】:

标签: c++ hash


【解决方案1】:

对于大多数标准库容器,答案是:不管感觉如何,这是一个留给库作者的实现细节。

但是,unordered_map 在这方面有点奇怪,因为它不仅必须以某种方式运行,而且它的实现方式也有限制。

来自标准:http://eel.is/c++draft/unord.req#general-9

无序关联容器的元素被组织成桶。具有相同哈希码的键出现在同一个桶中。当元素被添加到无序关联容器时,桶的数量会自动增加,因此每个桶的平均元素数保持在一个界限以下。重新散列使迭代器无效、更改元素之间的顺序以及更改哪些桶元素出现在其中,但不会使指针或对元素的引用无效。对于 unordered_multiset 和 unordered_multimap,rehashing 保留了等价元素的相对顺序。

简而言之,地图在任何给定时间都有N 桶。哈希函数的结果用于通过按照bucket_id = hash_value % N 执行某些操作来选择存储桶。如果桶开始变得太“满”,地图将增加N,并重新组织其内容。

没有真正指定存储桶中的事物是如何组织的。它通常是一个链表。

【讨论】:

  • 谢谢,弗兰克。我的老师曾经告诉我们,python 字典和 c++ std::unordered_map 使用散列,因为它是有史以来最基本的东西,我只是认为这是我缺少的东西。所以事情并不是那么简单明了……
  • @DavidC.Rankin 我知道哈希表是什么,我不知道它在std::unordered_map 的实现中是如何使用的。
  • @Johnny:你知道std::unordered_map 字面上只是一个奇怪的哈希表吗?
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 2015-09-14
  • 2022-11-02
  • 2011-11-05
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多