当前位置: 首页 > news >正文

递推预处理floor(log_2{n})

在C++中,除了使用<cmath>中的loglog2函数求对数,也可以通过递推求出所有可能用到的⌊log⁡2i⌋,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]log2i,i[1,n]

证明:⌊log⁡2i⌋=⌊log⁡2⌊i2⌋⌋+1\lfloor \log_2i \rfloor=\lfloor \log_2 \lfloor \frac{i}{2} \rfloor \rfloor+1log2i=log22i⌋⌋+1
由于log⁡2i=log⁡2(i2⋅2)=log⁡2i2+log⁡22=log⁡2i2+1\log_2i=\log_2(\frac{i}{2}\cdot 2)=\log_2\frac{i}{2}+\log_22=\log_2\frac{i}{2}+1log2i=log2(2i2)=log22i+log22=log22i+1
等号两边都向下取整,得:
⌊log⁡2i⌋=⌊log⁡2i2⌋+1\lfloor \log_2i \rfloor =\lfloor \log_2\frac{i}{2} \rfloor+1log2i=log22i+1

  • 如果iii是偶数,则i2=⌊i2⌋\frac{i}{2}=\lfloor \frac{i}{2} \rfloor2i=2i,因此有
    ⌊log⁡2i⌋=⌊log⁡2i2⌋+1=⌊log⁡2⌊i2⌋⌋+1\lfloor \log_2i \rfloor =\lfloor \log_2\frac{i}{2} \rfloor+1 = \lfloor \log_2\lfloor \frac{i}{2} \rfloor \rfloor+1log2i=log22i+1=log22i⌋⌋+1
  • 如果iii是奇数,则i−12=⌊i2⌋\frac{i-1}{2}=\lfloor \frac{i}{2} \rfloor2i1=2i
    ⌊log⁡2i−12⌋=x\lfloor \log_2\frac{i-1}{2} \rfloor =xlog22i1=x
    那么x≤log⁡2i−12<x+1x\le \log_2\frac{i-1}{2}<x+1xlog22i1<x+1
    2x≤i−12<2x+12^x\le \frac{i-1}{2}<2^{x+1}2x2i1<2x+1
    由于i−12\frac{i-1}{2}2i1是整数,2x+12^{x+1}2x+1也是整数,较小的整数加上12\frac{1}{2}21后,一定小于较大的整数。
    因此有2x≤i−12<i−12+12=i2<2x+12^x\le \frac{i-1}{2}<\frac{i-1}{2}+\frac{1}{2}=\frac{i}{2}<2^{x+1}2x2i1<2i1+21=2i<2x+1
    所以x≤log⁡2i2<x+1x\le \log_2{\frac{i}{2}}<x+1xlog22i<x+1
    因此⌊log⁡2i2⌋=x=⌊log⁡2i−12⌋=⌊log⁡2⌊i2⌋⌋\lfloor \log_2{\frac{i}{2}} \rfloor =x= \lfloor \log_2\frac{i-1}{2} \rfloor= \lfloor \log_2\lfloor \frac{i}{2}\rfloor \rfloorlog22i=x=log22i1=log22i⌋⌋
    因此⌊log⁡2i⌋=⌊log⁡2i2⌋+1=⌊log⁡2⌊i2⌋⌋+1\lfloor \log_2i \rfloor =\lfloor \log_2\frac{i}{2} \rfloor+1 = \lfloor \log_2\lfloor \frac{i}{2} \rfloor \rfloor+1log2i=log22i+1=log22i⌋⌋+1
    证毕。

已知⌊log⁡21⌋=0\lfloor \log_21 \rfloor=0log21=0,结合递推式⌊log⁡2i⌋=⌊log⁡2⌊i2⌋⌋+1\lfloor \log_2i \rfloor=\lfloor \log_2 \lfloor \frac{i}{2} \rfloor \rfloor+1log2i=log22i⌋⌋+1即可递推得到所有可能用到的⌊log⁡2i⌋,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]log2i,i[1,n]

代码如下:

const int N = 1000005;//N设为n可能达到的最大值
int lg[N];//lg[i]:floor(log_2{i})
void initLg(int n)//生成lg[1]~lg[n]
{//全局变量初值为0,已经设好lg[1] = 0for(int i = 2; i <= n; ++i)lg[i] = lg[i/2]+1;
}

预处理lg数组的时间复杂度为O(n)O(n)O(n)

http://www.lryc.cn/news/587568.html

相关文章:

  • 【脚本系列】如何使用 Python 脚本对同一文件夹中表头相同的 Excel 文件进行合并
  • uniapp video视频全屏播放后退出,页面字体变大,样式混乱问题
  • 基于Spring Boot的生活用品电商网站的设计与实现
  • 国内隧道IP代理技术解析:原理、优势与实战应用
  • 算法学习笔记:21.动态规划——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • linux 文件搜索与文件内容查看
  • Imx6ull用网线与电脑连接
  • 游戏玩法的专利博弈
  • 11、鸿蒙Harmony Next开发:列表布局 (List)
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • Spring Boot项目结构解析:构建高效、清晰的代码框架
  • UE5多人MOBA+GAS 22、创建技能图标UI,实现显示蓝耗,冷却,以及数字显示的倒数计时还有雷达显示的倒数计时
  • 【解决办法】越疆Dobot CR5 桌面客户端DobotStudio Pro连不上机器人
  • iOS高级开发工程师面试——Objective-C 语言特性
  • WPF的三轴机械手控件动画
  • MEMS IMU如何赋能无人机与机器人精准感知?
  • gitlab-ci.yml
  • 厘米级精准定位+低功耗通信,飞睿智能UWB技术赋能机器人高效作业
  • 触想CX-3588主板在安保巡检领域的落地实践:解锁机器人自主智能
  • LeetCode--45.跳跃游戏 II
  • MMKV 存储json list数据(kotlin)
  • 各种开发语言主要语法对比
  • 嵌入式硬件篇---单稳态多谐施密特电路
  • 第八章排序 选择题
  • Linux 基础操作:vim 编辑器、网络配置与远程登录全解析
  • 算法-线性枚举
  • 【算法】贪心算法:摆动序列C++
  • 解决Qt中“known incorrect sRGB profile“警告的Photoshop修改方法
  • 【记录】BLE|百度的旧蓝牙随身音箱手机能配对不能连接、电脑能连接不能使用的解决思路(Wireshark捕获并分析手机蓝牙报文)
  • 一文读懂循环神经网络(RNN)—语言模型+n元语法(1)