新闻中心

C++怎么实现一个二进制索引树(BIT)_C++数据结构与Fenwick树的高效实现

2025-11-23
浏览次数:
返回列表
二进制索引树(Fenwick树)通过lowbit操作实现O(log n)单点更新和前缀和查询,基于1-indexed数组,支持高效动态前缀和计算与区间和查询,适用于频繁更新与求和场景,代码简洁且性能优越。

c++怎么实现一个二进制索引树(bit)_c++数据结构与fenwick树的高效实现

二进制索引树(Binary Indexed Tree, BIT),也叫 Fenwick 树,是一种高效处理动态前缀和查询与单点更新的数据结构。它支持在 O(log n) 时间内完成单点修改和前缀和查询,实现简洁且常数小,特别适合频繁更新与查询的场景。

BIT 的基本原理

BIT 利用整数的二进制表示特性来组织数据。每个节点 tree[i] 存储从某个位置开始、长度为 i & (-i)(即 lowbit)的区间和。

关键操作是 lowbit(x),用于提取 x 的最低位 1 所代表的值:

int lowbit(int x) {
    return x & (-x);
}

例如:lowbit(6) = lowbit(110₂) = 10₂ = 2。

树的构建与操作实现

BIT 通常基于 1-indexed 数组实现,便于计算父节点与子节点关系。

1. 单点更新

将位置 i 的值增加 delta,并更新所有覆盖该位置的节点:

void update(int i, int delta) {
    while (i <= n) {
        tree[i] += delta;
        i += lowbit(i);
    }
}

2. 前缀和查询

计算从 1 到 i 的前缀和:

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic
int prefix_sum(int i) {
    int sum = 0;
    while (i > 0) {
        sum += tree[i];
        i -= lowbit(i);
    }
    return sum;
}

3. 区间查询

区间 [l, r] 的和可通过前缀和相减得到:

int range_sum(int l, int r) {
    return prefix_sum(r) - prefix_sum(l - 1);
}

C++ 完整实现示例

下面是一个完整的 BIT 类封装:

#include <iostream>
#include <vector>
using namespace std;
<p>class FenwickTree {
private:
vector<int> tree;
int n;</p><pre class='brush:php;toolbar:false;'>int lowbit(int x) {
    return x & (-x);
}

public: FenwickTree(int size) { n = size; tree.assign(n + 1, 0); }

void update(int i, int delta) {
    while (i <= n) {
        tree[i] += delta;
        i += lowbit(i);
    }
}

int prefix_sum(int i) {
    int sum = 0;
    while (i > 0) {
        sum += tree[i];
        i -= lowbit(i);
    }
    return sum;
}

int range_sum(int l, int r) {
    return prefix_sum(r) - prefix_sum(l - 1);
}

};

// 使用示例 int main() { FenwickTree bit(5); bit.update(1, 10); bit.update(2, 20); bit.update(3, 30);

cout << "Sum [1,3]: " << bit.range_sum(1, 3) << endl; // 输出 60
cout << "Sum [2,4]: " << bit.range_sum(2, 4) << endl; // 输出 50

bit.update(2, 10); // 更新位置2 +10
cout << "Sum [1,3]: " << bit.range_sum(1, 3) << endl; // 输出 70

return 0;

}

应用场景与优势

BIT 适用于以下场景:

  • 动态数组的频繁前缀和查询
  • 逆序对计数(配合离散化)
  • 一维或多维差分更新与查询
  • 替代线段树在简单需求下的使用,代码更短,效率更高

相比线段树,BIT 实现更简单,内存占用更少,常数更小。虽然功能稍有限,但在只涉及单点更新+前缀查询时是首选。

基本上就这些。掌握 lowbit、update 和 prefix_sum 三个核心,就能灵活运用 BIT 解决很多问题。

以上就是C++怎么实现一个二进制索引树(BIT)_C++数据结构与Fenwick树的高效实现的详细内容,更多请关注其它相关文章!


# 解决方法  # 国外游戏推广网站推荐  # 随州网络营销推广软件  # 英文seo外链收录  # 周至推广线上营销供应商  # 银核装修推广网站  # 满洲里网站seo  # 自助云商城网站微博推广  # 温州seo公司名字  # 上蔡营销网络推广中心  # seo斗牛工具  # 多维  # 配置文件  # c++  # 新和  # 怎么做  # 重写  # 适用于  # 有什么  # 数据结构  # 单点  # 内存占用  # stream  # ios  # ai  # 二进制索引树 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 126邮箱账号注册 电脑版登录入口  Excel Power Pivot如何处理XML数据源 构建高级数据模型  Android Studio计算器C键功能异常排查与修复教程  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  J*aScript生成器_j*ascript异步迭代  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  离线运行Go语言之旅:本地部署与GOPATH配置指南  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  Flexbox布局实践:实现粘性导航栏与底部固定页脚  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  AO3最新官网入口公告_2025AO3镜像站实时查询方法  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  葱吃多了会怎样 葱吃多了会伤胃吗  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  12306选座系统怎么选连座_12306选座多人连坐操作方法  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  C++ vector二维数组定义_C++ vector of vector用法  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  在Socket.IO连接中实现Access Token自动更新与动态重连  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  从J*aScript对象中精确提取指定属性的教程  如何有效阻止外部脚本意外修改内联样式的高度属性  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  PHP URL参数传递与500错误调试指南  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  J*a中实现Go语言select通道多路复用机制  必由学官网首页入口 必由学教师网页版登录指南  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  京东单号查询入口_京东快递订单追踪入口  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  必由学在线入口 必由学网页版快速登录入口  Angular中单选按钮的正确使用与常见陷阱解析  新三国志曹操传110级星符试炼夏侯渊极难攻略  浏览器打开即用 美图秀秀网页版入口  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  痛风发作了怎么办? 快速止痛和后期饮食调理  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法 

搜索