大O的复杂度是否总是不线性?

问题描述 投票:1回答:4

我敢肯定,如果函数输入大小为n,则嵌套循环的复杂度为O(n ^ 2)

for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
...
}
}

我以类似的观点认为这是相似的,但是我不确定有人可以确认吗?

for(int i = 0, max = n*n; i < max; i++{
...
}

如果是这样,我想除了递归和子例程,还有一些代码的O映射不是立即显而易见的。

theory complexity-theory big-o
4个回答
6
投票

您的基本简单循环始终为O(m),其中m是迭代的上限。但是您的m实际上是n * n,所以它是O(n ^ 2)。


2
投票

如果m = n ^ 2,则“简单为”在m中肯定是线性的。如果您想说这是n ^ 2,请继续。

Big-O标记在这里计数操作。如果您要执行n ^ 2个操作,由于执行m次操作,我不确定将n ^ 2作为总和的报告内容。

您的建议对我没有意义。这笔款项的真实名称具有误导性。正确的说法是O(m)。


2
投票

取决于您所说的“简单”是什么意思。也可以将大小为n的排序数组中的二分搜索写成非嵌套的for循环,但是它的时间为O(log(n))。就像您正确地说的那样,从0到n*n的for循环将在O(n*n)时间内执行。

是的,在某些代码中,运行时间不是立即显而易见的。甚至还有一些代码,其效果甚至目的也不是很明显:)


1
投票

它仍然是O(n)-除了在这种情况下您的“ n”是“ n * n”。您只是增加了n的值-而不是增加了循环的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.