Fenwick树,俗称树状数组
也就是二叉索引树(Binary Indexed Tree,BIT)
它的作用是什么呢
支持快速区间信息的维护和查询
为什么说是快速,因为它真的很快
O(nlog n)预处理
O(log n)维护和更新
先来看一个问题
给定一个n个元素的数组A
我们进行下面两个操作
1 add(x,d): 让A[x]增加d
2 query(l,r): 计算A[l]+A[l+1]+…+A[r]
怎么办
计算前缀和S,这可以在O(1)的时间解决query。但一旦进行add之后前缀后要重新算过。
不难发现如果进行add(x,d),对前面的前缀和是没有影响的,所以只要更新x之后的就好了
但其实还是不行,以为每次更新的花费还是很大
为什么花费会大
因为一个S的信息存储太大了,所以我们改小一点
但也不能太小,否则和直接算就一样了
所以我们用一个新的东西来存
下面来看一个图
注意到这里的C和我们之前的S很像
那我们就这样处理
用C来记一个和,但不是前缀和,而是类似与前缀和
仔细看这个图,如果我们要求前缀和,从C一直向右走,把走到的所有C加起来就是S
query解决了
再来看add
再看这个图,如果我们要更新一个点,从C一直向左走,把走到的所有C都加d就行了
那我们应该怎么走呢
先介绍一个东西lowbit
lowbi

Fenwick Tree,又称树状数组,是一种二叉索引树,用于快速区间信息的维护和查询。它提供O(nlog n)的预处理和O(log n)的更新与查询操作。通过低bit技巧,可以实现add(x,d)更新和query(l,r)查询功能,解决了传统前缀和在更新后的效率问题。初始化时,可以通过add(i,A[i])完成,具有较高的时间复杂度效率。"
122744412,12120508,西门子SinuTrain最新版仿真软件操作与调试,"['西门子', '数控系统', 'FPGA开发', '软件仿真', 'CSS']
最低0.47元/天 解锁文章
8923

被折叠的 条评论
为什么被折叠?



