C ++标准std::unordered_map
的无序映射是一个哈希表数据结构,这意味着它具有恒定的访问时间复杂度O(1)。
但是如何计算哈希码以提供唯一的密钥索引来访问表的成员(此外还有一个可以是任何类型的条目)?我猜计算本身可能很复杂(如MD5)以避免碰撞?
在这种情况下,算法仍然足够快,在操作std::unordered_map
时可以忽略不计吗?
答案 0 :(得分:2)
std::map
不是散列映射。使用自平衡树实现;因此,std::map
具有O(log n)查找时间。
std::unordered_map
是一个hashmap。 std::unordered_map
已经(摊销)O(1)查询时间,并且由std::hash
参数化,这取决于实现。
因此,没有人在整个实现中使用散列函数。
你可以自由地提供你自己的哈希函子,它实现了std::hash
,但要注意:有说谎的龙。 很多研究用于快速制作不同的C ++实现。
答案 1 :(得分:2)
标准未指定无序映射的散列算法。图书馆实施者可以自行决定。它可能是MurmurHashUnaligned2,Fowler–Noll–Vo或其他东西。它的实现已定义。
答案 2 :(得分:2)
你把事情弄糊涂了。 C ++ 中的哈希表为C ++标准std :: map的无序映射是一个哈希表数据结构,这意味着它具有恒定的访问时间复杂度O(1)。
std::unordered_map
,可确保不断搜索/插入/删除复杂性。
散列算法是实现定义的,您可以通过std::hash
专业化提供自己的散列。
答案 3 :(得分:1)
默认的散列算法本身没有指定,只是它有一些要求(请参阅[hash.requirements]和[unord.hash]以了解对unordered_map
等无序关联容器的特异性:
key1 == key2
,则hash(key1) == hash(key2)
hash(key)
不会抛出异常hash(key)
完全取决于key
(因此哈希值始终为同一个键返回相同的值)hash(key)
不得修改密钥