python实现fenwick tree芬威克树算法案例

 更新时间:2024年10月21日 09:42:18   作者:luthane  
芬威克树,又称为二叉索引树或树状数组,是一种高效的数据结构,由Peter M. Fenwick于1994年提出,主要用于计算数组的前缀和以及支持对数时间复杂度的元素更新,通过维护一个特定的数组,利用整数的二进制特性进行区间和存储

fenwick tree芬威克树算法介绍

Fenwick Tree,也被称为Binary Indexed Tree(二叉索引树)或树状数组,是由Peter M. Fenwick在1994年以“A New Data Structure for Cumulative Frequency Tables”为题首次介绍的一种数据结构。

Fenwick Tree主要用于高效地计算数字序列(数组)的前缀和,同时支持对数时间复杂度的元素更新操作。

基本概念

  • Fenwick Tree通过维护一个数组来记录原数组在不同区间的和,以便在O(log n)的时间复杂度内回答前缀和查询和单点更新的问题。
  • 与传统的前缀和数组相比,Fenwick Tree在处理频繁的元素更新时更加高效,因为它不需要重新构建整个前缀和数组。

原理

  • Fenwick Tree利用整数的二进制表示特性,将每个元素与多个区间相关联,并将这些区间的和存储在Fenwick Tree的数组中。
  • 每个索引i在Fenwick Tree中对应的节点存储的是从i - lowbit(i) + 1到i(包含)的区间内所有元素的和,其中lowbit(i)是i在二进制表示下最低位的1所对应的值。

主要操作

  • 单点更新:当需要更新原数组中的某个元素时,Fenwick Tree通过修改该元素在Fenwick Tree中对应节点及其所有祖先节点的值来反映这一变化,这一过程的时间复杂度为O(log n)。
  • 前缀和查询:对于给定的索引x,Fenwick Tree通过累加从x到根节点路径上所有节点的值来计算从数组开头到索引x(包含)的元素和,这一过程的时间复杂度同样为O(log n)。

实现

Fenwick Tree的实现通常包括以下几个部分:

  • 初始化:创建一个与原始数组等长的Fenwick Tree数组,并将所有元素初始化为0。
  • 单点更新:通过不断累加index + lowbit(index)的方式,更新Fenwick Tree中对应节点的值。
  • 前缀和查询:通过不断减去index - lowbit(index)的方式,累加Fenwick Tree中对应节点的值,直到index为0。

示例

  • 假设有一个数组a = [1, 2, 3, 4, 5],我们可以构建一个Fenwick Tree来高效地计算前缀和。
  • 例如,要计算前缀和a[0] + a[1] + a[2],我们只需要在Fenwick Tree中进行几次简单的查找和累加操作即可。

注意事项

  • Fenwick Tree只能高效地处理前缀和查询和单点更新操作,对于其他类型的区间查询和更新操作可能不适用。
  • 在实现Fenwick Tree时,需要注意数组索引的偏移(通常从1开始而不是从0开始),以简化操作并避免越界问题。

fenwick tree芬威克树算法python实现样例

Fenwick Tree(也称为Binary Indexed Tree)是一种用于高效计算前缀和(Prefix Sum)的数据结构,可以在O(log n)时间内进行插入、查询和更新操作。

下面是一个实现Fenwick Tree算法的Python代码示例:

class FenwickTree:
    def __init__(self, n):
        self.size = n
        self.tree = [0] * (n + 1)

    # 更新操作:将索引i位置的元素增加delta
    def update(self, i, delta):
        while i <= self.size:
            self.tree[i] += delta
            i += i & -i

    # 查询操作:计算前i个元素的和
    def query(self, i):
        res = 0
        while i > 0:
            res += self.tree[i]
            i -= i & -i
        return res

    # 计算区间[i, j]的和
    def range_query(self, i, j):
        return self.query(j) - self.query(i-1)

使用示例:

fenwick_tree = FenwickTree(10)
fenwick_tree.update(1, 2)
fenwick_tree.update(3, -1)
fenwick_tree.update(5, 5)

print(fenwick_tree.range_query(1, 5))  # 输出:6
print(fenwick_tree.range_query(3, 7))  # 输出:4

在上面的代码中,FenwickTree类的构造函数接受一个整数参数n,表示Fenwick Tree的大小。

  • update方法用于更新Fenwick Tree中的某个元素
  • query方法用于计算前i个元素的和
  • range_query方法用于计算区间[i, j]的和

在使用Fenwick Tree的时候,可以根据实际需求进行适当的修改。

例如:

  • 可以将update方法修改为将索引i位置的元素设置为delta,而不是增加delta。
  • 高级应用还包括计算逆序对个数、计算逆序对的和等等。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Django中的forms组件实例详解

    Django中的forms组件实例详解

    这篇文章主要介绍了Django的forms组件,本文通过实例代码介绍了Django的forms组件,需要的朋友可以参考下
    2018-11-11
  • Pandas设置DataFrame的index索引起始值为1的两种方法

    Pandas设置DataFrame的index索引起始值为1的两种方法

    DataFrame中的index索引列默认是从0开始的,那么我们如何设置index索引列起始值从1开始呢,本文主要介绍了Pandas设置DataFrame的index索引起始值为1的两种方法,感兴趣的可以了解一下
    2024-07-07
  • 在Python的while循环中使用else以及循环嵌套的用法

    在Python的while循环中使用else以及循环嵌套的用法

    这篇文章主要介绍了在Python的while循环中使用else以及循环嵌套的用法,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Python读取配置文件-ConfigParser的二次封装方法

    Python读取配置文件-ConfigParser的二次封装方法

    这篇文章主要介绍了Python读取配置文件-ConfigParser的二次封装方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • python 详解如何使用GPU大幅提高效率

    python 详解如何使用GPU大幅提高效率

    CuPy是一个开源矩阵库,使用NVIDIA CUDA加速。CuPy使用Python提供GPU加速计算。CUPY使用CUDA相关库,包括 CuBLAS、CUDNN、Curand、CuoSver、CuPaSeSE、Cufft和NCCL,以充分利用GPU架构
    2021-11-11
  • python df遍历的N种方式(小结)

    python df遍历的N种方式(小结)

    本文主要介绍了python df遍历的N种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • python判断列表字典字符串元组是否存在某个值或者空值(多种方法)

    python判断列表字典字符串元组是否存在某个值或者空值(多种方法)

    这篇文章主要介绍了python判断列表字典字符串元组是否存在某个值或者空值,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-02-02
  • python操作mysql实现一个超市管理系统

    python操作mysql实现一个超市管理系统

    超市管理系统有管理员和普通用户两条分支,只需掌握Python基础语法,就可以完成这个项目,下面这篇文章主要给大家介绍了关于python操作mysql实现一个超市管理系统的相关资料,需要的朋友可以参考下
    2022-12-12
  • 如何用值获取Python字典的键问题

    如何用值获取Python字典的键问题

    这篇文章主要介绍了如何用值获取Python字典的键问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • PyQt5利用QPainter绘制各种图形的实例

    PyQt5利用QPainter绘制各种图形的实例

    下面小编就为大家带来一篇PyQt5利用QPainter绘制各种图形的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论