是否在std::map
O(1)上查找关键字?我以为直到我想到它为止。它基于树实现,因此查找时间应为O(log N),正确吗?
并且,是否可以让O(1)查找字符串键std::unordered_map
?
答案 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 []
复杂性:平均情况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)时间。