我需要计算此代码的复杂性。我知道它是 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++;
}
}
答案 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)
您不必每次都输入数字,但每当您遇到困难时,这应该让您直观地了解如何解决这些问题。