定义法 O(n)
记
k=⌊log2n⌋
即
k≤log2n<k+1
等价于
2k≤n<2k+1
由于 log2n 和 ⌊x⌋ 都是单调增函数,则 ⌊log2n⌋ 也是,可用双指针优化。
for (int i = 2, j = 1; i <= n; i++) {
while (1 << j + 1 <= i) j++;
lg2[i] = j;
}
上述代码中,内层 while
总共执行 ⌊log2n⌋ 次,可忽略不计。
递推法 O(n)
由
log2n=log2(n2×2) =log2n2+log22 =log2n2+1
得
⌊log2n⌋=⌊log2n2+1⌋ =⌊log2n2⌋+1 =⌊log2⌊n2⌋⌋+1
关于式 (1),若 n 为偶数显然成立。若 n 为奇数
设
n=2k+1,k∈N+
则
n2=k+12 ⌊n2⌋=k
设
2m≤k<2m+1,m∈N
则
2m≤k+12<2m+1
则
⌊log2k⌋=⌊log2(k+12)⌋=m
则
⌊log2⌊n2⌋⌋=⌊log2n2⌋
for (int i = 2; i <= n; i++) lg2[i] = lg2[i >> 1] + 1;