我知道以下代码被认为是“线性或Θ(n)”我不明白的是我们如何知道它是。
假设n已被恰当地声明并且已设置为值。
int sum = 0;
for (int i = 0; i < n*2; i++ )
sum++;
下面是一个非线性的附加循环,但我的问题是我们如何通过仅查看代码来确定可能的速度?就n而言,Θ复杂度更具体。
int sum = 0;
for ( int i = 0; i < n; i++)
for ( int j = i; j < n; j += 2)
sum++;
答案 0 :(得分:1)
在您的第一个示例中,您只有一个for loop
。 i
值线性增加,直到满足条件i<n*2;
。 for循环的执行时间线性地取决于n
的值,因此其时间复杂度为 O(n),因为i
值与{{1}成正比}}。
在第二个示例中,您嵌套了n
。 for loops
值线性增加,对于每个i
值,内部i
执行for loop
次,因为变量n/2
在每次迭代中增加2。由于外循环执行j
次,内循环每次外循环迭代执行n
次,此示例的总运行时间为n/2
。但通常,时间的不变部分可以忽略不计(或有时不被考虑)。所以我们可以说它的运行时间是 O(n ^ 2)。
根据Big O和Theta表示法的不同,Big O用于表示增长函数的上限,而Theta用于表示增长函数的紧密界限。有关差异的更多信息,请参阅Big O and Theta notation之间的差异。
答案 1 :(得分:0)
Big O概念可以被认为是 size n 的输入,在以下程序中处理/访问每个元素的次数是多少次?
所以对于你的第一个例子
int sum = 0;
for (int i = 0; i < n*2; i++ )
sum++;
n的大小并不重要。它只关于循环运行多少次n。因此,由于这段代码将循环n * 2次,因此它的运行时间也是n * 2。这被称为线性或O(n)的原因即使它将运行n * 2次也是因为我们感兴趣的是在天文学上大的n值的运行时间的增长。那时,前面的2乘数变得无关紧要,这就是为什么它是o(n)。
int sum = 0;
for ( int i = 0; i < n; i++)
for ( int j = i; j < n; j += 2)
sum++;
在此示例中,程序将运行n *(n / 2)次。
n times in the i loop and n/2 times in the j loop
再次,因为我们对这个函数在天文大的n值上的增长感兴趣,n的1/2因子变得无关紧要,使得运行时间为n * n,或者n ^ 2