好的!,让我们假设一些值来帮助更好地理解:
让 n 等于 4
So now:
j=1 ( <4 ) => loop runs 1 time = O(1)
j=1*2 = 2 ( <4 ) => loop runs 2 times = 2*O(1)
j=2*2 = 4 ( =4 ) => loop runs 4 times = 4*O(1)
如果 n 属于 2^x 类型,那么可以肯定地说,一系列循环运行如下所示:
O(1) + 2*O(1) + 4*O(1) + 8*O(1) + 16*O(1) + ..... + n*O(1)。= 1*(2^(x+1) - 1)*O(1)/(2-1) = (2n-1)*O(1) = O(n) 其中 n = 2^x,并且外循环运行 x+1 次。
现在如果 n 不是 2^x 类型。假设 n = 6。
So now:
j=1 ( <6 ) => loop runs 1 time = O(1)
j=1*2 = 2 ( <6 ) => loop runs 2 times = 2*O(1)
j=2*2 = 4 ( <6 ) => loop runs 4 times = 4*O(1)
j=2*4 = 8 ( >6 ) => loop exits.
很明显,外部循环只会运行 2^( floor value( log base 2(n) )) + 1 次。这个值就是有效的 n。
所以让我们把它代入公式: (2n-1) O(1) => (2 (2^(floorValue(logBase2(n))) - 1)*O(1) 约等于 O(n)