二进制索引树(Fenwick树)通过lowbit操作实现O(log n)单点更新和前缀和查询,基于1-indexed数组,支持高效动态前缀和计算与区间和查询,适用于频繁更新与求和场景,代码简洁且性能优越。
二进制索引树(Binary Indexed Tree, BIT),也叫 Fenwick 树,是一种高效处理动态前缀和查询与单点更新的数据结构。它支持在 O(log n) 时间内完成单点修改和前缀和查询,实现简洁且常数小,特别适合频繁更新与查询的场景。
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 的前缀和:
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);
}
下面是一个完整的 BIT 类封装:
#include#include using namespace std; class FenwickTree { private: vector
tree; int n; 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 zuojiankuohaophpcn= n) { tree[i] += delta; i += lowbit(i); } } int prefix_sum(int i) { int sum = 0; while (i youjiankuohaophpcn 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 zuojiankuohaophpcnzuojiankuohaophpcn "Sum [1,3]: " zuojiankuohaophpcnzuojiankuohaophpcn bit.range_sum(1, 3) zuojiankuohaophpcnzuojiankuohaophpcn endl; // 输出 60 cout zuojiankuohaophpcnzuojiankuohaophpcn "Sum [2,4]: " zuojiankuohaophpcnzuojiankuohaophpcn bit.range_sum(2, 4) zuojiankuohaophpcnzuojiankuohaophpcn endl; // 输出 50 bit.update(2, 10); // 更新位置2 +10 cout zuojiankuohaophpcnzuojiankuohaophpcn "Sum [1,3]: " zuojiankuohaophpcnzuojiankuohaophpcn bit.range_sum(1, 3) zuojiankuohaophpcnzuojiankuohaophpcn endl; // 输出 70 return 0;}
BIT 适用于以下场景:
相比线段树,BIT 实现更简单,内存占用更少,常数更小。虽然功能稍有限,但在只涉及单点更新+前缀查询时是首选。
基本上就这些。掌握 lowbit、update 和 prefix_sum 三个核心,就能灵活运用 BIT 解决很多问题。
# c++
# ai
# ios
# stream
# 内存占用
# 封装
# int
# 数据结构
# public
# 单点
# 适用于
# 新和
# 多维
# 是一个
# 是一种
# 就能
# 但在
# 时间内
相关文章:
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
C++如何编写函数模板?(泛型编程入门)
建站之星在线客服如何快速接入解答?
如何在阿里云部署织梦网站?
制作电商网页,电商供应链怎么做?
如何在云主机上快速搭建多站点网站?
如何在橙子建站中快速调整背景颜色?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
临沂网站制作公司有哪些,临沂第四中学官网?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何在Windows服务器上快速搭建网站?
建站之星在线版空间:自助建站+智能模板一键生成方案
建站之星免费版是否永久可用?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
宝塔建站后网页无法访问如何解决?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
高防服务器租用首荐平台,企业级优惠套餐快速部署
深圳网站制作平台,深圳市做网站好的公司有哪些?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
宝塔Windows建站如何避免显示默认IIS页面?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站之星代理平台如何选择最佳方案?
如何基于云服务器快速搭建网站及云盘系统?
如何选择网络建站服务器?高效建站必看指南
如何快速使用云服务器搭建个人网站?
小建面朝正北,A点实际方位是否存在偏差?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何用IIS7快速搭建并优化网站站点?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
重庆市网站制作公司,重庆招聘网站哪个好?
做企业网站制作流程,企业网站制作基本流程有哪些?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
定制建站是什么?如何实现个性化需求?
如何高效搭建专业期货交易平台网站?
如何挑选高效建站主机与优质域名?
如何配置支付宝与微信支付功能?
Thinkphp 中 distinct 的用法解析
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
图册素材网站设计制作软件,图册的导出方式有几种?
MySQL查询结果复制到新表的方法(更新、插入)
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何快速查询网站的真实建站时间?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
网站制作免费,什么网站能看正片电影?
nginx修改上传文件大小限制的方法
建站ABC备案流程中有哪些关键注意事项?
制作网页的网站有哪些,电脑上怎么做网页?
制作宣传网站的软件,小红书可以宣传网站吗?
无锡营销型网站制作公司,无锡网选车牌流程?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
*请认真填写需求信息,我们会在24小时内与您取得联系。