快速求log2

题目描述

  • 给出一个数 \(x\) ,求 \(\lfloor log_2x\rfloor\)

算法1(调用 \(cmath\)

时间复杂度 \(O(log_2x)\)

printf("%d\n",log2(x));

多组数据?

算法2(递推 + 打表)

可以知道 \(\lfloor log_2x\rfloor=\lfloor log_2\frac x2\rfloor+1\) ,所以可以 \(O(MAX\_X)\) 预处理, \(O(1)\) 的询问

for (int i=2;i<=MAX_X;i++) f[i]=f[i>>1]+1;

\(x\) 比较大,无法预处理?

算法3(优化)

我们可以预处理到 \(\sqrt x\) ,然后通过前面的推出后面的

分两种情况考虑,我们就当 \(x\le2^{32}\)

如果 \(x\le2^{16}\) ,则结果是 \(f_x\) ,(\(f\) 数组是预处理好的)

否则,结果就是 \(f_{x/2^{16}}+16\) ,这样就能够做到 \(O(\sqrt n)\) 的预处理, \(O(1)\) 的询问了

void init(){
    for (int i=2;i<=(1<<16);i++) f[i]=f[i>>1]+1;
}
int query(int x){
    if (x<=(1<<16)) return f[x];
    else return f[x>>16]+16;
}
posted @ 2018-04-08 15:21 xay5421 阅读(...) 评论(...) 编辑 收藏