如何在map和undered_map之间进行选择

How to choose between map and unordered_map?

本文关键字:map 之间 行选 选择 undered      更新时间:2023-10-16

假设我想用字符串作为键映射数据。我应该选择哪个容器,map还是unordered_mapunordered_map占用更多的内存,所以我们假设内存不是问题,关注的是速度。

CCD_ 4通常应给出O(1)的平均复杂度和O(n)的最坏情况。在什么情况下它会到达O(n)?map什么时候比unordered_map更有时间效率?当n很小时会发生这种情况吗?

假设我将使用STLunordered_map和默认的haser Vs.映射。字符串是关键。

如果我要迭代元素,而不是每次访问单个元素,我应该更喜欢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| 

在实践中,如果内存没有问题,那么如果您想要单元素访问,unordered_map总是更快。

最坏的情况是理论上的,并且绑定到对所有元素进行说明的单个哈希。这与实际无关。一旦至少有logN个元素属于同一散列,unordered_map就会变慢。这也没有实际意义。在某些特殊情况下,您可以使用特定的哈希算法来确保更均匀的分布。对于不共享特定模式的普通字符串,unordered_map附带的通用散列函数也同样好。

如果要以排序的方式遍历映射(使用迭代器),则不能使用unordered_map。相反,map不仅允许这样做,而且可以根据键的近似值为您提供映射中的下一个元素(请参见lower_boundupper_bound方法)。

在什么情况下会达到O(n)?

如果您有这样一个坏的哈希函数,它为所有输入stiring生成相同的哈希值(即产生冲突)。。。

我应该选择哪个容器,映射还是取消映射?

这总是关于需求和数据类型/数量的问题。

什么时候映射比无序映射更有时间效率?

它只是不同的结构。你最好制作一个chiose来使用其中一个,这取决于你的典型用例(考虑到你有什么样的数据及其数量)

当n很小时它是hppaen吗?

在数据量较小的情况下,一切都取决于特定的STL实现。。。因此,有时即使是普通的向量/数组也可能比关联容器更快。。。

我应该选择哪个容器,映射还是取消映射?无序映射占用更多的内存,所以让我们假设内存不是问题,关注的是速度。

配置文件,然后决定。unordered_map通常更快,但因情况而异。

在什么情况下它会到达O(n)?

当哈希不好,并且一堆元素被分配到相同的bin时。

什么时候映射比无序映射更有时间效率?n小的时候会发生吗?

可能不会,但如果你真的在乎的话,请对其进行简介。让一个小容器成为程序的瓶颈似乎是极不可能的。无论如何,对于这种情况,具有线性搜索的简单vector可能更快。


决策时最重要的是排序的要求和迭代器无效的缺乏。如果你需要任何一种,你几乎必须使用map。否则,unordered_map

std::map在内部将元素存储在平衡的BST中。因此,元素将按键的排序顺序存储。

std::unordered_map使用哈希表存储元素。因此,元素将不会以任何排序顺序存储。它们将按任意顺序存储。

内存使用情况:

与map相比,无序映射中的内存使用率更高,因为无序映射也需要存储哈希表的空间。

搜索元素的时间复杂性:

在std::map中搜索元素的时间复杂度为O(logn)。即使在最坏的情况下,它也将是O(logn),因为元素在内部存储为平衡二进制搜索树(BST)。

然而,在std::unordereded_map中,搜索的最佳时间复杂度是O(1)。其中,如果散列码函数不好,那么最坏情况下的复杂性可以是O(n)