【发布时间】:2012-04-15 05:54:52
【问题描述】:
std::map 类的 find() 函数效率如何?它是遍历所有元素以寻找 O(n) 的键,还是在平衡树中,或者它使用散列函数还是什么?
【问题讨论】:
-
有 STL 的文档,它通常说明复杂性。 cplusplus.com/reference/stl/map/find
标签: c++ map complexity-theory std
std::map 类的 find() 函数效率如何?它是遍历所有元素以寻找 O(n) 的键,还是在平衡树中,或者它使用散列函数还是什么?
【问题讨论】:
标签: c++ map complexity-theory std
Log(n)基于红黑树。
编辑:n 当然是地图中的成员数。
【讨论】:
std::map::find 绝对是 log(n)。您提到缓存和“现实世界的约束”这一事实告诉我们您对大 O 表示法有误解。你认为std::map::find 有什么复杂性?
std::map 和 std::set 由编译器供应商使用高度平衡的二叉搜索树(例如红黑树、AVL 树)实现。
正如 David 正确指出的那样,find 需要 O(log n) 时间,其中 n 是容器中元素的数量。
但这是针对原始数据类型,例如 int、long、char、double 等,而不是字符串。
如果std:string,假设大小为“m”,用作键,遍历平衡二叉搜索树的高度将需要给定键的 log n 比较与条目树。
当std::string 是std::map 或std::set 的键时,find 和insert 操作将花费 O(m log n),其中 m 是需要找到的给定字符串的长度.
【讨论】:
hashCode()返回的hash key不是唯一标识,所以在比较两个key的时候还是需要做一个O(m)的字符串比较。
它不会迭代所有元素,它会进行二进制搜索(即 O(log(n)))。它使用 operator
如果你想要一个哈希映射,你可以使用一个 std::unordered_map(在 C++-0x 上添加),它使用一个哈希函数,平均而言(取决于你提供的哈希函数和数据)find() 将是O(1)。
【讨论】: