我在这里有一些代码,其中x像大O(n)一样增长,但是我不确定为什么。它看起来更像是一个对数大的O.我能得到一些帮助,找出它为什么像大O(n)一样成长?谢谢!
i = k; x = 1.0;
while (i > 1 ) {
i = (int) Math.floor( i / 2.0 );
x = x *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
,但只有十个"步骤"已执行,因为log21024
为10
。
答案 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