Algorithm 当无穷大接近零时,循环结束?
所以我想知道下面这个问题的时间复杂性。正确的答案是O(logN);如果循环终止,我理解这一点。但因为我们只有一半,所以理论上我可以接近0,但永远不会结束Algorithm 当无穷大接近零时,循环结束?,algorithm,Algorithm,所以我想知道下面这个问题的时间复杂性。正确的答案是O(logN);如果循环终止,我理解这一点。但因为我们只有一半,所以理论上我可以接近0,但永远不会结束 int a = 0, i = N; while (i > 0) { a += i; i /= 2; } 是的,循环实际上将结束。由于i是一个int,因此当您将i减半时,您正在执行整数除法。此除法的结果将向下舍入到最接近的整数。 例如: int i=3; in
int a = 0, i = N;
while (i > 0) {
a += i;
i /= 2;
}
是的,循环实际上将结束。由于
i
是一个int
,因此当您将i
减半时,您正在执行整数除法。此除法的结果将向下舍入到最接近的整数。
例如:
int i=3;
int j= i/2;
// j really is 1.5, but we're performing integer division
// so the result will be j =1
如果我们考虑你的程序运行< <代码> n=5 < /代码>,我们有:
第一次迭代:i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
第二次迭代:
i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
第三次迭代:
i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
是的,循环实际上将结束。由于
i
是一个int
,因此当您将i
减半时,您正在执行整数除法。此除法的结果将向下舍入到最接近的整数。
例如:
int i=3;
int j= i/2;
// j really is 1.5, but we're performing integer division
// so the result will be j =1
如果我们考虑你的程序运行< <代码> n=5 < /代码>,我们有:
第一次迭代:i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
第二次迭代:
i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
第三次迭代:
i=5;
i = i/2 = 5/2 = 2.5 = 2; //Round 2.5 down
i=2
i = i/2 = 2/2 = 1;
i=1;
i = i/2 = 1/2 = 0.5 = 0; //Round 0.5 down, loop finishes
请务必记住,您要除法的是
int
,而不是浮点值,因此不存在小数部分。相反,任何剩余部分都将被丢弃。一旦你降到1,一半是0.5,因为你只取整数部分,你将得到0。因此,这最终将结束
例如,如果您从10
开始:
10/2
是5
5/2
是2
和1
的剩余部分-剩余部分被丢弃-i
是2
2/2
是1
1/2
是0
和1
的余数-余数被丢弃-i
是0重要的是要记住,你是在除以int
,而不是浮点值,所以没有小数成分。相反,任何剩余部分都将被丢弃。一旦你降到1,一半是0.5,因为你只取整数部分,你将得到0。因此,这最终将结束
例如,如果您从10
开始:
10/2
是5
5/2
是2
和1
的剩余部分-剩余部分被丢弃-i
是2
2/2
是1
1/2
是0
和1
的余数-余数被丢弃-i
是0
因为您使用的是整数算术,所以我会转到0。
下面是一个使用
$picoc-i
正在启动picoc v2.1
picoc>#包括
#包括
picoc>inta=0,i=10;
int a=0,i=10;
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=10I=5
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=15I=2
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=17 i=1
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=18i=0
您的循环将在此点终止。因为您使用的是整数算术,所以我将转到0。
下面是一个使用
$picoc-i
正在启动picoc v2.1
picoc>#包括
#包括
picoc>inta=0,i=10;
int a=0,i=10;
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=10I=5
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=15I=2
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=17 i=1
picoc>a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a+=i;i/=2;printf(“a=%d i=%d\n”,a,i);
a=18i=0
您的循环将在此点终止