我直观地意识到两个for循环产生一个O(n ^ 2)函数,但是如果循环不相关则会怎样。怎么表达
例如:
for(x = 1; x < t; x++)
for(y = 1; y < z; y++)
do something trivial
end
end
是这个O(t * z)的重要组成部分?或者是O(n ^ 2)还是O(t ^ 2)。我一直忽视这一点,但我现在想知道。
由于
答案 0 :(得分:7)
是O(t * z)。如果你有两个嵌套循环,每个迭代都有n ^ 2,因为n * n:)
这就像计算区域..每次迭代z次...所以它直观地t * z ..
或者你可以想象在循环中有一个计数器..结果会是多少?
答案 1 :(得分:1)
基本上它确实是O(t * z),但除非有特定的问题,否则你通常会说O(n ^ 2)。其原因很简单:假设你有t,z,其中t≠z。那么对于任何特定的t,z存在t / z,它是常数。您可以将其分解,它在表达式中变为常量,并且您有n ^ 2。对于我们的目的,O(n ^ 2)与O(t ^ 2)相同 - 说O(t ^ 2)更正确,但是大多数人会理解你使用泛型n。
<强>更新强>
好的,对不起,让我们再进一步了解一下。我们给出t,z,两个正自然数,t≠z,并且t和z之间没有特定的函数关系。 (是的,可能这样的关系,但它不在问题陈述中。如果我们不能做出这个假设,那么问题就无法回答:考虑,例如, z = t x 。我们不知道 x ,所以我们不能说出运行时间是多少考虑 z = s t 。如果我能断言函数关系可能存在,那么答案是不确定的。)
现在,通过检查,我们可以看到它将是O(t * z)。调用实际运行时间 f(n)= n 2 的函数。根据定义, O(f(tz))表示某些常数k> 0的运行时间 f(tz)≤ kg(tz) 。除以z。然后 f(t)/ z ≤(k / z)g(t),因而 f(t)≤ kg (t)的。我们替换并获得 f(t)= t 2 并重命名变量使 O(n 2 )
答案 2 :(得分:1)
for(x = 1; x < t; x++)
for(y = 1; y < z; y++)
do something trivial
end
end
如上所述,这些循环执行(t-1)*(z-1) = t*z - t - z + 1 times -> O(t*z)
答案 3 :(得分:0)
通常两个for循环彼此之间是O(n ^ 2),读取O n squared
。
答案 4 :(得分:0)
我不知道如果没有关于如何使用循环的更多信息,我会考虑这个O(n ^ 2)。
如果z总是小于或等于1,你会得到O(n)或O(1)。