c++ STL map:是访问时间0(1)

C++ STL map: is access time O(1)?

本文关键字:时间 访问 STL map c++      更新时间:2023-10-16

键查找std::map 0(1)吗?我是这么想的,直到我仔细想想。它基于树的实现,所以查找时间应该是O(log N),对吗?

并且,是否可能有O(1)查找字符串键,std::unordered_map也许?

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

根据c++ 11标准关于std::map::operator []的23.4.4.3/4段:

:复杂性对数。

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

根据c++ 11标准关于std::unordered_map::operator []的第23.5.4.3/4段

复杂度:平均情况O(1),最坏情况O(size())。

注意:

如果你的问题只与计算复杂度有关,那么上面所写的应该能回答这个问题。实际上,操作的计算复杂度是根据容器的大小(容器中包含的元素数量)来衡量的。

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

为了查找一个键,首先需要生成它的哈希值;当键是字符串时,该操作本身的字符串大小可能是线性的。然后,实现必须将该键与同一bucket中的所有字符串键进行比较,并且这些比较中的每一次都是依次对这些字符串的大小进行线性比较。

是的,确实std::map将是O(log N)std::unordered_map将具有平均的常数时间复杂度,O(N)在最坏的情况下,如果有太多的哈希冲突。

std::map基本上是用红黑树来实现的。在红黑树中,插入和删除操作耗时O(LogN),因此在std::map中,每个元素的时间复杂度为O(LogN)。

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