有人可以解释此算法是O(log(n))
而不是O(n)
吗?
循环将运行给定数字中的所有数字。难道不是O(n)
吗?
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7))
return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8))
return 0;
rev = rev * 10 + pop;
}
答案 0 :(得分:0)
这取决于n
是什么。如果n
本身是x
(一个数值),则复杂度为O(log(n))
。如果将x
乘以10,则while
循环只会重复一遍,而不是十倍。同样,将x
乘以100只会添加两次迭代。
另一方面,如果变量s
是x
的字符串表示形式,而n
是字符串s
的长度,那么复杂度将为O(n)
。请注意,在这种情况下,s
的长度与log(x)
成正比,因此从数值的角度来看,对数是隐式的。
答案 1 :(得分:0)
这是一个思想实验:
n
中的位数,而不取决于n
的值。 n = 10
的迭代次数与n = 99
相同,因为它们都有两位数。n
中的数字位数以log(n)
的速率增长,因为添加一位数字要求n
至少要大10倍。因此,算法的复杂度为O(log(n))