std :: map中find()的时间复杂度?

时间:2012-04-01 03:50:00

标签: c++ map complexity-theory std

std :: map类的find()函数效率如何?它是否遍历查找密钥的所有元素,使其为O(n),或者是否在平衡树中,还是使用哈希函数或什么?

3 个答案:

答案 0 :(得分:35)

Log(n)它基于一棵红黑树。

编辑:n当然是地图中的成员数量。

答案 1 :(得分:17)

std::mapstd::set由编译器供应商使用高度平衡的二叉搜索树(例如红黑树,AVL树)实现。

正如大卫正确指出的那样,find将花费O(log n)时间,其中n是容器中元素的数量。

但这与原始数据类型相似,如intlongchardouble等,而不是字符串。

如果将std:string(比如大小'm')用作键,则遍历平衡二叉搜索树的高度将需要给定键的log n 比较进入树。

std::stringstd::mapstd::set的关键时,findinsert操作的费用为O(m log n),其中m为需要找到的给定字符串的长度。

答案 2 :(得分:3)

它不迭代所有元素,它进行二进制搜索(即O(log(n)))。它使用运算符<或比较器进行搜索。

如果你想要一个哈希映射,你可以使用std :: unordered_map(在C ++ - 0x上添加),它使用哈希函数并且平均(取决于你提供的哈希函数和数据)find()将是O(1)。