讲师中心 微信公众号
AI工具推荐 视频效率加速

高效计算第 N 个具有指定比特数(population count)的整数位置

陌静姑娘_1069

陌静姑娘_1069

发布时间:2026-06-14 16:39:35

|

553人浏览过

|

来源于php中文网

原创

本文介绍一种基于组合数学的 o(log k) 时间复杂度算法,用于精确求解:给定正整数 k,其二进制表示中含 m 个 1(即 bit_count = m),在所有 ≤ k 的非负整数中,它是第几个满足 bit_count = m 的数(即索引 n,从 0 开始计数)。

本文介绍一种基于组合数学的 o(log k) 时间复杂度算法,用于精确求解:给定正整数 k,其二进制表示中含 m 个 1(即 bit_count = m),在所有 ≤ k 的非负整数中,它是第几个满足 bit_count = m 的数(即索引 n,从 0 开始计数)。

该问题本质是:对固定比特数 M,将所有 bit_count = M 的非负整数按升序排列(即 0, 1, 2, …),求 K 在该子序列中的零基索引 N。例如,bit_count = 2 的序列前若干项为:3 (11₂), 5 (101₂), 6 (110₂), 9 (1001₂), 10 (1010₂), 12 (1100₂), …,则 K=5 对应 N=1。

直接遍历 0 到 K 显然不可行(尤其当 K 超过 10²⁰ 时)。高效解法的核心思想是逐位枚举 + 组合计数:从最低位(LSB)向最高位扫描 K 的二进制表示,每当遇到一个置位(bit = 1),就统计所有“更小但具有相同 M 值”的数——即:保持更高位不变,将当前位设为 0,并在右侧剩余位中,选择恰好 M - 已统计置位数 个位置填 1 的方案数。

具体步骤如下:

  1. 初始化 set_bits_seen = 0(已遍历的 1 的个数)、all_bits_seen = 0(已遍历的总位数)、total = 0(累计 N 值);
  2. 从 LSB 开始逐位处理 K(等价于循环 while k > 0,每次 k //= 2);
  3. 每轮 all_bits_seen 加 1;
  4. 若当前位为 1(即 k % 2 == 1):
    • set_bits_seen += 1;
    • 此时,若 all_bits_seen > set_bits_seen(即右侧尚有空位可安置剩余 1),则可构造合法数:将当前位强制置 0,右侧 all_bits_seen - 1 位中任选 set_bits_seen 个位置置 1(因更高位已固定为 0,且当前位变 0 后整体更小),方案数为组合数 C(all_bits_seen - 1, set_bits_seen);
    • 将该组合数累加到 total。

关键组合函数 n_choose_k(n, k) 需高效实现(避免阶乘溢出),推荐使用迭代式计算:

testing-python
testing-python

使用pytest编写和评估有效的Python测试。适用于编写测试、审查测试代码、调试测试失败或提高测试覆盖率。

下载
def nCk(n, k):
    if k < 0 or k > n:
        return 0
    if k == 0 or k == n:
        return 1
    k = min(k, n - k)  # 利用对称性减少计算
    num = 1
    den = 1
    for i in range(k):
        num *= n - i
        den *= i + 1
    return num // den

主算法 Python 实现如下:

def bit_count_rank(k: int) -> int:
    if k == 0:
        return 0
    set_bits = 0
    total_bits = 0
    rank = 0
    temp = k
    while temp:
        total_bits += 1
        if temp & 1:  # 当前位为1
            set_bits += 1
            # 右侧 total_bits-1 位中选 set_bits 个放1(当前位置0,确保更小)
            if total_bits > set_bits:
                rank += nCk(total_bits - 1, set_bits)
        temp >>= 1
    return rank

✅ 注意事项:

  • 本算法返回的是 严格小于 K 且 bit_count 等于 K 的数的个数,即 K 在其 bit_count 类别中的零基索引(与题中 N 定义完全一致);
  • 时间复杂度为 O(log₂K),空间复杂度 O(1),适用于任意大整数(如题中 K = 123456789123456789123456789,输出 N = 3594960708495168399327022);
  • 组合数计算务必使用整数迭代而非浮点或阶乘,防止大数精度丢失或溢出;
  • 该方法不依赖预计算或查表,纯数学推导,具备强可移植性(易转译至 C/Java/Rust 等语言)。

综上,该算法将“第 N 个 bit_count = M 的数”这一看似离散的问题,转化为对二进制位权重的组合枚举,是数位 DP 思想的精简典范。掌握此方法,即可在常数内存下瞬时求解千亿级输入的位统计索引。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4204

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24337

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2967

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3007

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn