如何在map和undered_map之间进行选择
How to choose between map and unordered_map?
假设我想用字符串作为键映射数据。我应该选择哪个容器,map
还是unordered_map
?unordered_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_bound
和upper_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)
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- int(c) 和 c-'0' 之间的区别。C++
- 使用一个考虑到std::map中键值的滚动或换行的键
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- MAP和Multimap之间的C 模板专业化
- 在内存使用方面,c++ 中的 map 和 unordered_map 之间有什么区别吗?
- std::map 实现在 Linux 和 Windows 之间有所不同
- NSMutabledictionary和STD :: Map的访问操作员之间的差异
- 如何在map和undered_map之间进行选择
- map< "string" ,..> 和 map<int,..> 之间的性能差异?
- std::map in class:在执行速度和内存使用之间进行权衡
- 如何作为类中的容器在std::map或std::unordereded_map之间切换
- c++中List和Map之间的性能问题
- c++中查找两个std::map之间匹配的有效方法
- "std::map with mutexes"与并行插入、查找、擦除之间是否有任何速度测试"libcds maps (Michael Hashmap and Split Order List)"?
- 查找set和map键之间的set_difference