数组树/fenwicktree/Binary Indexed Tree
在解类似 leetcode 307题区域和检索 - 数组可修改的题时,我们可以使用一种比较小众的数据结构,数组树。
数组树的结构依托于数组,它的结构看起来类似下面这种:
1,2,3。。。。代表他们在数组中的位置,在了解为什么有这种数据结构之前,请务必先看看上面提到的leetcode 307题。
在数组树中有两个主要的操作函数更新和查询。在更新数组中的某一个位置的数值的时候,其所有祖先节点全部都要更新,比如节点1更新,则2,4,8节点全部都要更新,更新的方式为当前节点的值加上子节点或自身更新后增加的值,比如现在节点1的值变为1,相对于原来的0值增加了1,则1,2,4,8的值都变为1;节点2的值变为4,相对于原来的0值增加了4,则2,4,8的值变为5。这种更新方式实际上是要在数组树中维护这样一个关系,节点值为sum(child.val) + self.val。
如果要更新数组树,那么必须找到更新的节点的所有祖先节点,计算方法为 i += lowbit(i);lowbit()的意思为数的二进制从最低位往高位计算,到第一个为1的位置,这之间的所有的二进制构成的数,比如1(b0001)的lowbit为(b0001),相加为2(b0010),2的lowbit为(b0010)相加为4(b0100)。lowbit的计算公式为lowbit(x) = x & (-x);以5为例,x = 5 = b0110 ,-x = ~x + 1 = b1010,lowbit(5) = 0010;
以上就是就是数组树的更新过程,如果要查询数组树,也就是获得前i个数组元素的和为多少时,毕竟这才是我们的目的,这时就需要用到另一种计算节点的方式。经过上面数组树更新方式的描述,我们可以很清楚的知道4存放了1,2,3,4的和,6存放了5,6的和,8存放了所有值的和,如果要计算前7个数的和,可想而知是要将数组树中4,6,7节点值相加。这实际上也有一个计算公式,i -= lowbit(i);它看起来就像下面这样。
这就是leetcode 307题所需要的数据结构,现在我们使用这个数据结构将这一题解决。在做题过程中一定要注意fenwicktree的下标是从1开始的。并且更新过程中传入的是相对于原来该元素增加的值。
class NumArray {FenwickTree tree;int[] nums;public NumArray(int[] nums) {tree = new FenwickTree(nums.length + 1);this.nums = nums;for(int i = 0; i < nums.length; i++){tree.update(i + 1, nums[i]);}}public void update(int i, int val) {tree.update(i + 1, val - nums[i]);nums[i] = val;}public int sumRange(int i, int j) {return tree.query(j + 1) - tree.query(i);}
}class FenwickTree{int[] sums;public FenwickTree(int n){sums = new int[n];}public void update(int i, int delta){while(i < sums.length){sums[i] += delta;i += lowbit(i);}}public int query(int i){int sum = 0;while(i > 0){sum += sums[i];i -= lowbit(i);}return sum;}private int lowbit(int i){return i&-i;}
}
数组树/fenwicktree/Binary Indexed Tree相关推荐
- js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)
本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...
- 树状数组 Binary Indexed Tree (B.I.T)
树状数组 算法训练营 树状数组 (Binary Indexed Tree(B.I.T), Fenwick Tree) 是一个查询和修改复杂度都为 log(n) 的数据结构. 「前缀和查询」与「单点更新 ...
- SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13275&rd=16008 由于图中边数不多,选择DFS遍历 ...
- 树状数组 Binary Indexed Tree/Fenwick Tree
2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...
- 树状数组(Binary Indexed Tree) 总结
1."树状数组"数据结构的一种应用 对含有n个元素的数组(a[1],...,a[k],...,a[n]): (1)求出第i个到第j个元素的和,sum=a[i]+...+a[j]. ...
- 树状数组(Binary Indexed Tree)
原文博客链接:https://www.cnblogs.com/acgoto/p/8583952.html 对于学习的线段树方面的,发现很多问题可以用它来求解,但是做题的时候发现,用线段树太容易tle也 ...
- python 树状数组_树状数组(Binary Indexed Tree) 总结
1."树状数组"数据结构的一种应用 对含有n个元素的数组(a[1],...,a[k],...,a[n]): (1)求出第i个到第j个元素的和,sum=a[i]+...+a[j]. ...
- java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)
二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建.这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树 ...
- 树状数组(Binary Index Tree)
树状数组(Binary Index Tree, BIT)是用用数组来模拟树形结构.最简单的树状数组支持两种操作,时间复杂度均为 O ( log n ) O(\log n) O(logn): ...
最新文章
- 背景图片等比缩放的写法background-size简写法
- k8s之CRD定义map[string]interface{}类型
- Vue.JS项目同时使用Element-UI与vue-i18n时实现国际化的方案
- C++ 11 新特性(十四)C++类
- C# 获取对象 大小 Marshal.SizeOf (sizeof 只能在不安全的上下文中使用)
- 平常代码练习报错问题解决
- webpack配置babel-loader
- DJANGO输出HIGHCHARTS数据的样例
- 51单片机驱动LCD1602显示原理及例程
- 配置ext邮箱服务器,Extmail实现邮件服务器
- android微信刷脸支付,安卓首发 Find X支持微信人脸支付功能
- 怎么缩小图片大小kb
- 什么是rip协议其优缺点_ospf和rip 优缺点
- TableOne数据分析工具
- down mark 打钩_Markdown 基本语法
- 关于COM中变体类型VARIANT
- git、github保姆级教程(手把手交)以及如何在github上提交pr,参与开源项目
- horizon服务主要模块_Horizon组件安装详解 - 远程连接OpenStack服务
- EBS R12多组织的实现原理
- 兼容IE 下载EXCEL
热门文章
- 【Ubuntu】安装Java和Eclipse
- Smali源代码分析教程(转)
- 更新ubuntu软件源
- MySQL配置文件my.cnf中文版
- WINCE6.0+S3C2443的启动过程---eboot5
- HTML常见小问题2
- 【搜遍互联网,集百家之长】环境配置从入门到放弃之Mac环境下,安装XAMPP,给phpstorm安装Xdebug调试工具...
- Eclipse Modeling Framework, 2nd Edition. (EMF)学习笔记(一)——EMF介绍
- Python学习笔记-DNS处理模块dnspython
- 309.	Best Time to Buy and Sell Stock with Cooldown