Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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程序的时间复杂度 void mystery2(int n) { int i; 对于(i=1;i 0) x-=δ; } 返回0; }_C_Algorithm_Time Complexity - Fatal编程技术网

如何确定这个c程序的时间复杂度 void mystery2(int n) { int i; 对于(i=1;i 0) x-=δ; } 返回0; }

如何确定这个c程序的时间复杂度 void mystery2(int n) { int i; 对于(i=1;i 0) x-=δ; } 返回0; },c,algorithm,time-complexity,C,Algorithm,Time Complexity,如何使用像这里这样的跟踪表而不是猜测来确定这个程序的时间复杂度 对于每个迭代,最初您有x=i,然后x每次递减1/i。所以这将被重复i/(1/i)=i^2次 因此,对于的每次迭代(i=1;i对于每次迭代,最初您有x=i,然后x每次递减1/i。因此这将重复i/(1/i)==i^2次 因此,对于(i=1;i的的每次迭代,这是相对简单的:您需要确定两个嵌套循环中的每个循环执行多少次,并同时考虑复杂性 外部循环对于循环来说是一个微不足道的;它执行n次 内部循环需要更多的注意:它不断地从i中减去1/i,直到

如何使用像这里这样的跟踪表而不是猜测来确定这个程序的时间复杂度

对于每个迭代,最初您有
x=i
,然后
x
每次递减
1/i
。所以这将被重复
i/(1/i)=i^2次


因此,对于
的每次迭代(i=1;i对于每次迭代,最初您有
x=i
,然后
x
每次递减
1/i
。因此这将重复
i/(1/i)==i^2


因此,对于(i=1;i的
的每次迭代,这是相对简单的:您需要确定两个嵌套循环中的每个循环执行多少次,并同时考虑复杂性

外部循环对于
循环来说是一个微不足道的
;它执行
n次

内部循环需要更多的注意:它不断地从
i
中减去
1/i
,直到它变为零或为负。很容易看出
i
迭代
,而
循环从
x
中减去
1
。由于
x
最初设置为
i
,t内部循环占用的总时间为
i^2

因此,总数是
x
的平方和,即
x
介于
1
n
之间


这扩展为
n^3/3+n^2/2+n/6
多项式,其复杂性为
O(n^3)

这相对简单:您需要确定两个嵌套循环的执行次数,并同时考虑复杂性

外部循环对于
循环来说是一个微不足道的
;它执行
n次

内部循环需要更多的注意:它不断地从
i
中减去
1/i
,直到它变为零或为负。很容易看出
i
迭代
,而
循环从
x
中减去
1
。由于
x
最初设置为
i
,t内部循环占用的总时间为
i^2

因此,总数是
x
的平方和,即
x
介于
1
n
之间


这就扩展到了多项式,它的复杂度是O(n^3)

Sum[n^2,{n,1,n}]
应该是
(n+1)(2n+1)n/6
oh 10x你甚至为我做了一张表!p但是有没有什么“数学”的方法来得到i/(1/i)==i^2你是怎么得到的?因为它感觉像是一种“猜测”@user1980750
x
的初始值是
i
对吗?在
循环中,
x
每次递减
1/i
,对吗?因此对于
x
0
,理论上你需要
i/(1/i)=i^2
这是一种数学运算。由于浮点数运算的精度损失,您可能需要多花一点时间或少花一点时间。但是这不应该改变这个内部循环的
O(n^2)
界限。
Sum[n^2,{n,1,n}]
应该是
(n+1)(2n+1)n/6
oh 10x您甚至为我做了一张表!:P但是有没有得到i/(1/i)=i^2的“数学”方法你是怎么得到这个的?因为这感觉像是一种“猜测”“@user1980750
x
的初始值是
i
对吗?在
while
循环中,
x
每次递减
1/i
,对吗?因此对于
x
0
,理论上你需要
i/(1/i)=i^2
这是一种数学运算。由于浮点数运算的精度损失,您可能需要多花一点时间或少花一点时间。但这不应改变此内部循环的
O(n^2)
界限。尽管您不必查找公式。
猜测
O(n^3)是最自然的
@phoeagon我同意,这里的猜测是正确的。但是,OP要求不要猜测,所以我让alpha帮我做计算。谢谢,我想我理解了第二次循环分析背后的思想。但是有什么数学方法可以得到这个答案吗?因为我们在课堂上学会了使用k变量..然后得到k==I^2Al虽然你不必去查公式,但最自然的是猜测它在O(n^3)处
@phoeagon我同意,这里的猜测是正确的。但是,OP要求不要猜测,所以我请alpha为我做计算。谢谢,我想我理解了第二个循环分析背后的思想。但是有没有数学方法得到这个答案?因为我们在课堂上学会了使用k变量..然后得到k==I^2
void mystery2 (int n)
{
 int i;
 for (i = 1; i <= n; i++) {
    double x = i;
    double delta = 1 / (double)i;
    while ( x > 0 )
      x -= delta;
  }
return 0;
}
    Outer loop(for)          Inner Loop
    I=1                      1
    I=2                      4
    I=3                      9
    ...                      ..
    I=N                      N^2
 TOTAL_                      ~N^3/6