遍历 std::set
/std::multiset
/std::map
/std::multimap
的时间复杂度是多少?我认为它是与 set/map 的大小成线性关系,但不太确定。它是否在语言标准中有明确规定?
遍历 std::set
/std::multiset
/std::map
/std::multimap
的时间复杂度是多少?我认为它是与 set/map 的大小成线性关系,但不太确定。它是否在语言标准中有明确规定?
所有迭代器的类别只需要那些在给定类别中可以在常数时间(摊销)内实现的函数。
由于迭代器上的每个操作都必须是常数时间,所以遍历n
个元素的时间复杂度必须是O(n)
。
std::set
、std::multiset
、std::map
和 std::multimap
,如果它们被实现为红黑树(这是最常见的情况),则查找下一个/前一个按顺序的元素的最坏复杂度为O(log N)
。当然,在实践中,平均情况是摊销常数。 - plasmacel我认为它是基于集合/映射的大小呈线性增长的,但并不确定。
那是正确的。遍历整个集合或映射的时间复杂度是O(N)
O(N)
。证明非常简单。容器set
和map
是使用红黑树实现的。每次从一个节点移动到另一个节点时,只需在它们之间画一条线。迭代完成后,您将看到所有的线都成双出现,每个节点都被访问了两次。 - Igor Mikushkin2n
的时间,因此是O(n)
。我也意识到我关于如何找到元素的描述是错误的。感谢您的帮助-我总是假设它是O(n*log(n))
。谢谢! - Elliott
O(n)
(我想真的很愚蠢的实现可能会使它变得更糟)。 - Chad