std::map类中的find()函数效率如何?它是否通过遍历所有元素查找键,从而变为O(n)级别,或者在平衡树中,或者使用哈希函数或其他什么方法?
std::map类中的find()函数效率如何?它是否通过遍历所有元素查找键,从而变为O(n)级别,或者在平衡树中,或者使用哈希函数或其他什么方法?
Log(n) 是指以红黑树为基础的时间复杂度。
编辑说明:n 指的是 map 中成员的数量。
std::map::find
的复杂度肯定是log(n)
。你提到缓存和“现实世界的限制”这一事实表明你对大O符号有误解。你认为std::map::find
具有什么样的复杂度? - Mooing Duckstd::map
和 std::set
是由编译器供应商使用高度平衡的二叉搜索树(例如红黑树,AVL树)实现的。
正如David所指出的那样,find
将需要O(log n)的时间,其中n是容器中元素的数量。
但是这仅适用于像 int
、long
、char
、double
等原始数据类型,而不是字符串。
如果将长度为'm'的std:string
作为键,则遍历平衡二叉搜索树的高度将需要与树条目的给定键进行 log n 次比较。
当 std::string
是 std::map
或 std::set
的键时,find
和 insert
操作的成本将为 O(m log n),其中m是需要查找的给定字符串的长度。
hashCode()
返回的哈希键不是唯一标识符,所以在比较两个键时还需要进行O(m)的字符串比较。 - jogojapan它不会遍历所有元素,而是进行二进制搜索(时间复杂度为O(log(n)))。它使用operator<或比较器来进行搜索。
如果你想要一个哈希映射,你可以使用std::unordered_map (在C++-0x中添加),它使用哈希函数,并且平均情况下(find()的速度取决于提供的哈希函数和数据)时间复杂度为O(1)。