如何确定这个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你是怎么得到的?因为它感觉像是一种“猜测”@user1980750x
的初始值是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的“数学”方法你是怎么得到这个的?因为这感觉像是一种“猜测”“@user1980750x
的初始值是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