c++ STL map:是访问时间0(1)
C++ STL map: is access time O(1)?
键查找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)时间。
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- 我的C++程序如何访问计算机的日期和时间以打印和使用当前年份?
- 如何在对数时间内访问 c++ std::set 中的第 k 个元素?
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 对列表中的任意元素的常量时间访问 (C++)
- 是二维阵列访问/修改时间组
- 持续的时间访问是否在某个时候意味着连续内存
- 缓存 - RAM访问时间
- DFS 访问内部的地图元素.时间复杂度
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- 如何在Qt中将访问时间限制为一种方法
- PDH 无法通过 PdhAddCounter() 访问总 CPU 时间
- 测量 ARM Cortex-A15 的缓存访问时间/周期
- C++地图访问和迭代所花费的时间
- 最适合正确测量缓存访问时间的计时器
- 使用大型数组索引增加访问时间
- 容器具有恒定的时间,用于访问任何元素,从前面弹出并向后推
- 为什么我的std::unordereded_map访问时间不是恒定的
- C++无序映射恒定时间访问
- 如何计算内存访问时间