这个算法的复杂性是多少?

时间:2014-11-07 21:22:49

标签: algorithm complexity-theory time-complexity asymptotic-complexity

我需要计算此代码的复杂性。我知道它是 O(n),,但我需要公式中的证据。例如,循环具有复杂度1 + 3*n + n*f(body)

代码1:

int i = 0;
int t = 0;
int j = n/2;
while (i<n) {
    while (t<n/2) {
        t++;
        i++;
    }
    while (j<n) {
        j++;
        i++;
   }

}

UPD: 我也需要计算这段代码的复杂性。它与代码1不同吗?

代码2:

int k = 0;
int i = 0;
int t = 0;
int j = n/2;
while (i<n) {
    k=0;
    while ((t<n/2) && (k<=10)) {
         t++;
         i++;
         k++;
    }
    k=0;
    while ((j<n) && (k<=10)) {
         j++;
         i++;
         k++;
    }
}

2 个答案:

答案 0 :(得分:6)

在t-while循环中,i应该从0递增到(n / 2)-1,并且在下一个j循环中,i递增到i

因此,在一次迭代中,我应该执行外循环!

此外,t和j的while循环执行彼此互斥。但是,它们通常将i --- t从o增加到n / 2 - 1,j从n / 2增加到n-1。

因此,代码复杂性

= i-loop *的单次迭代(内部循环的复杂性)

= O(1)*(基于t的循环的复杂性 UNION 基于j的循环的复杂性)

= O(1)*(O(n / 2) UNION O(n / 2))

= O(1)* O(n / 2)

= O(n)。

所以,你的结论是正确的。此代码的复杂性为O(n) ...


在谈论代码2时,它与代码1没有太大区别!只添加了一个新的变量k,它将导致内循环仅迭代10次,因为它与&&条件有界。

  

此外,基于i的循环将在1次迭代中迭代n / 20次   对于i-loop,在执行两者之后i被修改为20   内循环...因此,在n / 20次迭代后,我将完成小于n的测试。   因此,基于i的循环的算法性能= O(n / 20)......

因此,代码2的复杂性

= i-loop *的多次迭代(内部循环的复杂性)

= O(n / 20)*(O(1) UNION O(1))
//内部循环将运行10次迭代,因此,它们的复杂性为O(1)。

= O(n)。

因此,代码2的复杂性将是O(n) ...

答案 1 :(得分:1)

当您不熟悉某事时,理解(或计算效率)的最佳方法是尝试一些随机值。

假设n = 100,

int i = 0;
int t = 0;
int j = n/2;

按照这些说明,i = 0; t = 0且j = 50

while (i<n) {

当i = 100时,表示会中断。

    while (t<n/2) {
             t++;
             i++;
        }

由于此循环从t = 0到t = 50(50次),因此t = 50且i = 50的最终值(两者都递增)

    while (j<n) {
         j++;
         i++;
    }
}

由于此循环从j = 50到j = 100(50次),因此最终值j = 100且i = 100(两者都递增)

所以你可以看到第一个while循环“while(i

因此,要计算操作的数量,我们所要做的就是在循环内部循环时加倍,如果循环在同一级别则相加。 所以这里是:  (外环运行)*(内环运行)= 1 *(50 + 50)= 100。 请注意,这等于我们开始的100(n)。 因此该程序具有1n的复杂度,即O(n)

对于任何其他实例,如果我们的最终答案为500,那么它将是5n的复杂性,即仍为O(n)

您不必每次都输入数字,但每当您遇到困难时,这应该让您直观地了解如何解决这些问题。