地图和unordered_maps时间复杂度分析

问题描述

我曾经相信unordered_map在时间复杂度方面比C ++中的map更好。但是今天,当我在做一个问题(莫莉的化学品)时,我超过了时限。经过大量的猜测工作(因为我认为我的解决方案是正确的),我尝试使用地图而不是unordered_map,但令人惊讶的是我被它接受了。在某些情况下,由于很多碰撞,unordered_map可能会有大常数乘数,它将使它的实际复杂度增加到大于映射的复杂度(欢迎更正)。

搜索time complexity个不同的functions of maps and unordered maps中的很多内容,但是我找不到合适的内容,因为我想知道何时应该使用地图或无序地图。有人可以在时间复杂度方面解释地图的使用与unoredered_maps之间的区别。

解决方法

unordered_map

ISO C ++ [tab:container.hash.req]unordered_map的要求:

+------------------+-----------------------------------------------------+
|    Expression    |                     Complexity                      |
+------------------+-----------------------------------------------------+
| a_­uniq.insert(t) | Average case O(1),worst case O(a_uniq.size()).     |
| a.erase(k)       | Average case O(a.count(k)),worst case O(a.size()). |
| b.find(k)        | Average case O(1),worst case O(b.size()).          |
+------------------+-----------------------------------------------------+

在最坏的情况下,unordered_map中每个运算符的时间复杂度为O(n)。如果所有元素都在同一bucket中,则会发生这种情况。

通过在Codeforces上跟踪诸如the post之类的编译器代码,可以构造特殊的测试数据,从而说明如何在gcc上构造此类测试数据。

地图

ISO C ++ [tab:container.assoc.req]map的要求:

+------------------+--------------------------+
|     Expression   |        Complexity        |
+------------------+--------------------------+
| a_­uniq.​insert(​t) | logarithmic              |
| a.erase(k)       | log(a.size())+a.count(k) |
| b.find(k)        | logarithmic              |
+------------------+--------------------------+

保证map的时间复杂度为O(log n)

,

map后面的数据结构是rb-tree,而unordered_map使用哈希表作为其数据结构。因此,我们可以通过解析rb-tree和哈希表来对这两个容器进行分析。

在地图中查找/插入元素:O(log n) 在unordered_map中查找/插入元素:O(1)