C ++ STL map:是访问时间O(1)?

时间:2013-04-17 19:07:27

标签: c++ data-structures c++11 std

是否在std::map O(1)上查找关键字?我以为直到我想到它为止。它基于树实现,因此查找时间应为O(log N),正确吗?

并且,是否可以让O(1)查找字符串键std::unordered_map

3 个答案:

答案 0 :(得分:41)

std::map的查找复杂度为O(log N)(容器大小的对数)。

根据std::map::operator []的C ++ 11标准的第23.4.4.3/4段:

  

复杂性:对数。

std::unordered_map的查找复杂度在平均情况下为O(1)(常数),在最坏情况下为O(N)(线性)。

根据std::unordered_map::operator []

的C ++ 11标准的第23.5.4.3/4段
  

复杂性:平均情况O(1),最差情况O(size())。

注意:

如果您的问题只涉及计算复杂性,那么上面写的内容应该回答它。事实上,操作的计算复杂性是根据容器的大小(它包含的元素数量)来衡量的。

但是,如果您正在寻找一种方法在使用字符串键的容器上执行O(1)查找,并且查找的复杂性相对于字符串的长度而不是容器的大小,答案是std::unordered_map不符合您的要求。

为了查找密钥,首先需要生成密钥;当键是一个字符串时,这个操作本身可以是字符串大小的线性。然后,实现必须比较同一个桶中所有字符串键的键,并且这些比较中的每一个在这些字符串的大小上都是线性的。

答案 1 :(得分:5)

是的,确实std::map将是O(log N),而std::unordered_map将具有平均恒定时间复杂度,并且在最坏的情况下O(N)如果存在太多哈希冲突。< / p>

答案 2 :(得分:0)

使用红黑树隐含基本std :: map。在红黑树中插入和删除操作需要O(LogN)时间,因此在std :: map中,时间复杂度是每个元素的O(LogN)。

std :: unodered_map使用散列实现,其中每个操作花费O(1)时间。