C 这段代码的时间复杂度是多少,你能解释一下你是如何计算的吗?
下面的代码我发现时间复杂度为n^2,如果这是正确的C 这段代码的时间复杂度是多少,你能解释一下你是如何计算的吗?,c,C,下面的代码我发现时间复杂度为n^2,如果这是正确的 int numbers[9] = {1, 5, 7, 8, 9, 14, 21}; int check = 50; int count = 0; for (int i = 0; i < 9; i++) { int squared = numbers[i]*numbers[i]; int target = check - squared; for (int j = i; j < 9; j++) {
int numbers[9] = {1, 5, 7, 8, 9, 14, 21};
int check = 50;
int count = 0;
for (int i = 0; i < 9; i++) {
int squared = numbers[i]*numbers[i];
int target = check - squared;
for (int j = i; j < 9; j++) {
if (numbers[j]*numbers[j] == target) {
count++;
}
}
}
if (count == 2) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
整数[9]={1,5,7,8,9,14,21};
整数校验=50;
整数计数=0;
对于(int i=0;i<9;i++){
整数平方=数[i]*数[i];
int目标=校验平方;
对于(int j=i;j<9;j++){
如果(数字[j]*数字[j]==目标){
计数++;
}
}
}
如果(计数=2){
printf(“是\n”);
}否则{
printf(“否”);
}
返回0;
是的,最坏情况下的时间复杂度为O(n^2),其中n显然是数组的长度
要找到任何代码的时间复杂度,您需要计算代码中最经常使用的函数执行了多少次。在这种情况下,这是比较numbers[j]*numbers[j]==target
。
在发现这种情况下的数学运算很容易之后,外循环最多执行n次(在这种情况下,硬编码为9,不推荐),对于每一次,内循环最多执行n次,从而导致最坏情况下的时间复杂度为O(n^2)
如果您还对最佳情况的时间复杂度感兴趣,它仍然是O(n^2),但可以很容易地降到2。我认为您的输入数据是
数字[n]
其中n=9
简单说明
算法的最后一部分:
if(计数=2){
printf(“是\n”);
}否则{
printf(“否”);
}
返回0;
此代码是O(1)
,printf
,if-else
,return
不按数字进行缩放
出于同样的原因,这些行(断章取义)具有O(1)
int numbers[9] = {1, 5, 7, 8, 9, 14, 21};
int check = 50;
int count = 0;
所有不随输入数据缩放的对象都具有O(1)
循环造成复杂性
for(int i=0;i
公共循环运行任务n
次,这意味着此循环的复杂性为O(n)*复杂性(任务)
在您的算法中有嵌套循环,这意味着
intk=n;
对于(int i=0;i
任务的复杂性是O(k*1)=O(k)=O(n)
循环的复杂性是O(n*复杂性(任务))=O(n*k)=O(n^2)
可以这样理解:
将9
更改为int n=9代码>,以及
for i = 0, inner loop 0, 1, 2, ...., n - 1
for i = 1, inner loop 1, 2, ...., n - 1
for i = 2, inner loop 2, ...., n - 1
......
for i = n-1, inner loop n - 1
所以所有的运算都需要n*n/2=O(n^2)
这可能会有帮助
if (numbers[j]*numbers[j] == target) {
count++;
}
for i = 0, inner loop 0, 1, 2, ...., n - 1
for i = 1, inner loop 1, 2, ...., n - 1
for i = 2, inner loop 2, ...., n - 1
......
for i = n-1, inner loop n - 1