问题描述
我曾经相信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)