while循环的大O.

时间:2015-10-23 02:55:28

标签: java big-o logarithm

我在这里有一些代码,其中x像大O(n)一样增长,但是我不确定为什么。它看起来更像是一个对数大的O.我能得到一些帮助,找出它为什么像大O(n)一样成长?谢谢!

      i = k;    x = 1.0;
  while (i > 1 ) {
    i = (int) Math.floor( i / 2.0 );
    x = x *2  ; 

2 个答案:

答案 0 :(得分:3)

复杂性分析与变量中的值最终没有关系,它是算法的属性,简单地(对于时间复杂度)基于某些输入值需要执行多少步骤

在这种情况下,给定输入值k,您的复杂度为O(log N),因为除以2和#34;将剩余的解空间减半。在每次迭代中,沿着以下几行:

i = 128 64 32 16 8 4 2 1

如上所述,变量x的增长与算法复杂性无关,每次循环都会加倍。

因此,您有一个由每次迭代减半的值控制的循环。你有一个变量,每次迭代加倍:

i = 128 64 32 16  8  4  2   1
 x =  1  2  4  8 16 32 64 128

因此,输入值和最终变量值之间的关系将是线性关系,如等效的Python代码所示:

ctrl = 1024
other = 1
while ctrl > 0:
    print('{0:4d} {1:4d}'.format(ctrl, other))
    ctrl = ctrl // 2
    other = other * 2

输出:

1024    1
 512    2
 256    4
 128    8
  64   16
  32   32
  16   64
   8  128
   4  256
   2  512
   1 1024

请注意,虽然other中的最终值为1024,但只有十个"步骤"已执行,因为log2102410

答案 1 :(得分:2)

如果您希望优化问题,看起来您只是在计算最大位

使用Integer.highestOneBit(int i)

可以更有效地实现这一点

定义为

public static int highestOneBit(int i) {
    // HD, Figure 3-1
    i |= (i >>  1);
    i |= (i >>  2);
    i |= (i >>  4);
    i |= (i >>  8);
    i |= (i >> 16);
    return i - (i >>> 1);
}

并且应该在恒定时间(O(1))运行,因为它只是位运算符

它是如何工作的是通过将位向下移位同时将其与自身进行“或”运算,使得超过最大位的所有位变为1,然后隔离最大值,减去该数字移位以移除所有尾随1