在C+中的嵌套for循环中迭代映射的时间复杂度是多少+;? 我知道C++中的映射是一个平衡的二叉搜索树。但是,当我在嵌套for循环中迭代映射时,我想知道时间复杂度是多少 for (auto x : mp) { for (auto y : mp) { // // } } C++标准要求前向迭代器被固定时间,因此每个循环都是θ(n)。因为它们是嵌套的,所以复杂性为θ(n^2)

在C+中的嵌套for循环中迭代映射的时间复杂度是多少+;? 我知道C++中的映射是一个平衡的二叉搜索树。但是,当我在嵌套for循环中迭代映射时,我想知道时间复杂度是多少 for (auto x : mp) { for (auto y : mp) { // // } } C++标准要求前向迭代器被固定时间,因此每个循环都是θ(n)。因为它们是嵌套的,所以复杂性为θ(n^2),c++,algorithm,time-complexity,C++,Algorithm,Time Complexity,如果您有一个(平衡的或非平衡的)具有父链接的二叉搜索树,那么在最坏的情况下,增加一个迭代器是O(logn),但是O(1)在整个树迭代中摊销,因为遍历中的每个节点最多访问3次(当您第一次遇到节点时,在遍历它下面的左子树之后,一次遍历它下面的右子树)。 < P> C++要求前向迭代器被固定时间,因此每个循环都是θ(n)。因为它们是嵌套的,所以复杂性将是θ(n ^ 2)。 如果您有一个(平衡的或非平衡的)具有父链接的二叉搜索树,那么在最坏的情况下,增加一个迭代器是O(logn),但是O(1)在整个树迭

如果您有一个(平衡的或非平衡的)具有父链接的二叉搜索树,那么在最坏的情况下,增加一个迭代器是O(logn),但是O(1)在整个树迭代中摊销,因为遍历中的每个节点最多访问3次(当您第一次遇到节点时,在遍历它下面的左子树之后,一次遍历它下面的右子树)。

< P> C++要求前向迭代器被固定时间,因此每个循环都是θ(n)。因为它们是嵌套的,所以复杂性将是θ(n ^ 2)。
如果您有一个(平衡的或非平衡的)具有父链接的二叉搜索树,那么在最坏的情况下,增加一个迭代器是O(logn),但是O(1)在整个树迭代中摊销,因为遍历中的每个节点最多访问3次(第一次遇到节点时,一次在遍历节点下方的左子树后,一次在遍历节点下方的右子树后)。

取决于
mp
迭代器的实现。每个for循环创建一个迭代器实例,但在后台,它们可以依赖于相同的对象

在最简单的情况下,它将是外环,而不是内环,因此很容易O(n²)

在一个奇怪的情况下,它可能是O(n),但是迭代器的实现被逻辑搞得一团糟(也许有人可以给出一个很好的理由)

在更奇怪的情况下,它不能确定第一个迭代器何时被下一个迭代器的创建所干扰。主要原因是迭代器类中会使用惰性静态循环变量或静态指针

对于元素仅作为二叉树可用的特殊情况,请考虑迭代器的工作方式:next()将是左、右或无(=向后向上),因此具有最大递归树长度的固定搜索长度。平衡意味着通常有一组l/r和提示日志(n)无元素,将其视为一个常数因子,表示n*=nx log(n)。因此,预期的答案是O((n*log(n))²)=O(n²*log(n)²),关于超出Landau的部分是第一部分,当涉及到相关元素数量时,同样是O(n²)


即使如此,检查map的内部结构并基于键而不是map.get()创建迭代器也是性能明智的。取决于
mp
迭代器的实现。

每个for循环创建一个迭代器实例,但在后台它们可以依赖相同的对象

在最简单的情况下,它将是外环,而不是内环,因此很容易O(n²)

在一个奇怪的情况下,它可能是O(n),但是迭代器的实现被逻辑搞得一团糟(也许有人可以给出一个很好的理由)

在更奇怪的情况下,它不能确定第一个迭代器何时被下一个迭代器的创建所干扰。主要原因是迭代器类中会使用惰性静态循环变量或静态指针

对于元素仅作为二叉树可用的特殊情况,请考虑迭代器的工作方式:next()将是左、右或无(=向后向上),因此具有最大递归树长度的固定搜索长度。平衡意味着通常有一组l/r和提示日志(n)无元素,将其视为一个常数因子,表示n*=nx log(n)。因此,预期的答案是O((n*log(n))²)=O(n²*log(n)²),关于超出Landau的部分是第一部分,当涉及到相关元素数量时,同样是O(n²)


即使如此,检查map的内部结构并基于键而不是map.get()创建迭代器也是性能明智的.

如果没有中断,那么它将是这些复杂性的产物。你有什么想法吗?@Quimby,我知道遍历一个映射只是对它执行一个按序遍历。按序遍历的时间复杂性是O(n)。我们执行了两次按序遍历。这就是为什么我认为复杂性是O(n^2)但我不确定我是否正确。问题归结为:增加一个映射迭代器的时间复杂度是多少。我不知道它是什么,但假设它是
X
,那么总数是
O(n*(X+n*X)) @ NaveEnkuMar是的,一般来说是这样的,但是C++编译器是可以自由优化的,如果它能证明它不会改变结果,它可以重新排序循环。所以,这取决于你对循环的处理。空循环很可能被优化,独立的循环可以被推高。如果没有中断,那么它就是产品。这些复杂性。你有什么想法?@Quimby,我知道遍历一个映射只是对它执行一个按序遍历。按序遍历的时间复杂性是O(n)。我们做了两次按序遍历。这就是为什么我认为复杂性是O(n^2)但我不确定我是否正确。问题归结为:增加一个映射迭代器的时间复杂度是多少。我不知道它是什么,但假设它是
X
,那么总数是
O(n*(X+n*X)) @ NaveEnkuMar是,应该是一般的,但是C++编译器是可以自由优化的,如果它能证明它不会改变结果,它可以重新排序循环。所以,这取决于你对循环做了什么——空循环很可能被优化掉,独立的循环可以被推高。?可以展开吗?如果打印每个
(x,y)
,将有O(n^2)个。迭代器next()可以是