低于O(log n)而不是O(n)的复杂度如何

时间:2018-09-10 17:24:08

标签: time-complexity

有人可以解释此算法是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;
}

2 个答案:

答案 0 :(得分:0)

这取决于n是什么。如果n本身是x(一个数值),则复杂度为O(log(n))。如果将x乘以10,则while循环只会重复一遍,而不是十倍。同样,将x乘以100只会添加两次迭代。

另一方面,如果变量sx的字符串表示形式,而n是字符串s的长度,那么复杂度将为O(n)。请注意,在这种情况下,s的长度与log(x)成正比,因此从数值的角度来看,对数是隐式的。

答案 1 :(得分:0)

这是一个思想实验:

  1. 算法取决于n中的位数,而不取决于n的值。 n = 10的迭代次数与n = 99相同,因为它们都有两位数。
  2. n中的数字位数以log(n)的速率增长,因为添加一位数字要求n至少要大10倍。

因此,算法的复杂度为O(log(n))