Θ的复杂性

时间:2015-03-04 01:55:03

标签: java time-complexity

我知道以下代码被认为是“线性或Θ(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++;

2 个答案:

答案 0 :(得分:1)

在您的第一个示例中,您只有一个for loopi值线性增加,直到满足条件i<n*2;。 for循环的执行时间线性地取决于n的值,因此其时间复杂度为 O(n),因为i值与{{1}成正比}}。

在第二个示例中,您嵌套了nfor 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