map
还是 unordered_map
?假设内存不是问题,关注的是速度,unordered_map
通常会给出平均复杂度 O(1),最坏情况下为 O(n)。 什么情况下会达到 O(n)?在什么情况下 map
比 unordered_map
更高效?当 n 很小的时候发生吗?假设我要使用 STL unordered_map
,默认哈希函数,字符串是键。如果我要迭代元素而不是每次访问单个元素,我应该选择 map
吗?map
还是 unordered_map
?假设内存不是问题,关注的是速度,unordered_map
通常会给出平均复杂度 O(1),最坏情况下为 O(n)。 什么情况下会达到 O(n)?在什么情况下 map
比 unordered_map
更高效?当 n 很小的时候发生吗?假设我要使用 STL unordered_map
,默认哈希函数,字符串是键。如果我要迭代元素而不是每次访问单个元素,我应该选择 map
吗? | map | unordered_map
---------------------------------------------------------
element ordering | strict weak | n/a
| |
common implementation | balanced tree | hash table
| or red-black tree|
| |
search time | log(n) | O(1) if there are no hash collisions
| | Up to O(n) if there are hash collisions
| | O(n) when hash is the same for any key
| |
Insertion time | log(n)+rebalance | Same as search
| |
Deletion time | log(n)+rebalance | Same as search
| |
needs comparators | only operator < | only operator ==
| |
needs hash function | no | yes
| |
common use case | when good hash is| In most other cases.
| not possible or |
| too slow. Or when|
| order is required|
map
的元素排序是“严格弱”? - John实际应用中,如果内存不是问题,unordered_map
在单个元素访问方面总是更快的。
最坏情况是理论上的,限制于一个哈希值包含所有元素。这对实际无关紧要。只要你有至少对数 N 个属于同一哈希值的元素,unordered_map
就会变慢。这也对实际无关紧要。在某些特殊场景下,您可以使用特定的哈希算法,以确保更加均匀的分布。对于不共享特定模式的普通字符串,与 unordered_map
一起提供的通用哈希函数同样好。
如果您想以排序方式遍历(使用迭代器)映射,就不能使用 unordered_map
。相反,map
不仅允许这样做,而且还可以根据键的近似值为您提供地图中的下一个元素(请参见 lower_bound
和 upper_bound
方法)。
在什么情况下会变成O(n)?
如果您有一个糟糕的哈希函数,该函数为所有输入字符串生成相同的哈希值(即产生冲突)...
我应该选择哪个容器,map还是unordered_map?
这始终是要考虑需求和数据种类/数量的问题。
什么时候使用map比unordered_map更有效率?
它们只是不同的结构。最好根据典型的使用情况(考虑您拥有的数据类型及其数量)选择使用其中之一。
n很小时会发生吗?
在小数据量的情况下,一切都取决于特定的STL实现...因此有时甚至普通的向量/数组比关联容器更快...
std::map内部使用平衡二叉搜索树存储元素。因此,元素将按键的排序顺序存储。
std::unordered_map使用哈希表存储元素。因此,元素不会按任何排序顺序存储。它们将以任意顺序存储。
内存使用:
与map相比,unordered_map的内存使用更多,因为unordered_map需要空间来存储哈希表。
搜索元素的时间复杂度:
在std::map中搜索元素的时间复杂度为O(log n)。即使在最坏情况下,它也将是O(log n),因为元素在内部存储为平衡二叉搜索树(BST)。
而在std::unordered_map中,搜索的最佳情况时间复杂度为O(1)。但是,如果哈希码函数不好,则最坏情况的复杂度可能为O(n)。
unordered_map
的实现使用更多的内存? - Peter Wood