Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这段代码的时间复杂度是多少,你能解释一下你是如何计算的吗?_C - Fatal编程技术网

C 这段代码的时间复杂度是多少,你能解释一下你是如何计算的吗?

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++) {

下面的代码我发现时间复杂度为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++) {
        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