AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 吐槽
  • App
  • 登录/注册

预处理 $\lfloor log_2n \rfloor$ 的两种方法

作者: 作者的头像   美琴 ,  2023-09-18 06:45:27 ,  所有人可见 ,  阅读 38


2


定义法 $O(n)$

记

$$
k = \lfloor log_2n \rfloor
$$

则

$$
\begin{aligned}
log_2n - 1 < k \le log_2n
\end{aligned}
$$

则

$$
\begin{aligned}
2^k \le n < 2^{k + 1}\\
\end{aligned}
$$

由于 $log_2n$ 和 $\lfloor x \rfloor$ 都是单调增函数,则 $\lfloor log_2n \rfloor$ 也是,可用双指针优化。

for (int i = 2, j = 1; i <= n; i++) {
  while (1 << j + 1 <= i) j++;
  lg2[i] = j;
}

上述代码中,内层 while 总共执行 $log_2n$ 次,可忽略不计。

递推法 $O(n)$

由

$$
\begin{aligned}
log_2n &= log_2(\frac{n}{2} \times 2) \\
&= log_2 \frac{n}{2} + log_22 \\
&= log_2 \frac{n}{2} + 1
\end{aligned}
$$

得

$$
\begin{eqnarray}
\lfloor log_2n \rfloor &= \lfloor log_2 \frac{n}{2} + 1 \rfloor \\
&= \lfloor log_2 \frac{n}{2} \rfloor + 1 \\
&= \lfloor log_2 \lfloor \frac{n}{2} \rfloor \rfloor + 1 \tag{1}
\end{eqnarray}
$$

关于式 $(1)$,若 $n$ 为偶数显然成立。若 $n$ 为奇数

设

$$
n = 2k + 1, k \in \mathbb{N^{+}}
$$

则

$$
\begin{aligned}
& \frac{n}{2} = k + \frac{1}{2} \\
& \lfloor \frac{n}{2} \rfloor = k
\end{aligned}
$$

设

$$
2^m \le k < 2^{m + 1}, m \in \mathbb{N}
$$

则

$$
2^m \le k + \frac{1}{2} < 2^{m + 1}
$$

则

$$
\lfloor log_2k \rfloor = \lfloor log_2(k + \frac{1}{2}) \rfloor = m
$$

则

$$
\lfloor log_2\lfloor \frac{n}{2} \rfloor \rfloor = \lfloor log_2\frac{n}{2} \rfloor
$$

for (int i = 2; i <= n; i++) lg2[i] = lg2[i >> 1] + 1;

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息