Algorithm 当无穷大接近零时,循环结束?

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

所以我想知道下面这个问题的时间复杂性。正确的答案是O(logN);如果循环终止,我理解这一点。但因为我们只有一半,所以理论上我可以接近0,但永远不会结束

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
您的循环将在此点终止