在解类似 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相关推荐

  1. js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)

    本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣​leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...

  2. 树状数组 Binary Indexed Tree (B.I.T)

    树状数组 算法训练营 树状数组 (Binary Indexed Tree(B.I.T), Fenwick Tree) 是一个查询和修改复杂度都为 log(n) 的数据结构. 「前缀和查询」与「单点更新 ...

  3. SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=13275&rd=16008 由于图中边数不多,选择DFS遍历 ...

  4. 树状数组 Binary Indexed Tree/Fenwick Tree

    2018-03-25 17:29:29 树状数组是一个比较小众的数据结构,主要应用领域是快速的对mutable array进行区间求和. 对于一般的一维情况下的区间和问题,一般有以下两种解法: 1)D ...

  5. 树状数组(Binary Indexed Tree) 总结

    1."树状数组"数据结构的一种应用 对含有n个元素的数组(a[1],...,a[k],...,a[n]): (1)求出第i个到第j个元素的和,sum=a[i]+...+a[j]. ...

  6. 树状数组(Binary Indexed Tree)

    原文博客链接:https://www.cnblogs.com/acgoto/p/8583952.html 对于学习的线段树方面的,发现很多问题可以用它来求解,但是做题的时候发现,用线段树太容易tle也 ...

  7. python 树状数组_树状数组(Binary Indexed Tree) 总结

    1."树状数组"数据结构的一种应用 对含有n个元素的数组(a[1],...,a[k],...,a[n]): (1)求出第i个到第j个元素的和,sum=a[i]+...+a[j]. ...

  8. java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)

    二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建.这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树 ...

  9. 树状数组(Binary Index Tree)

    树状数组(Binary Index Tree, BIT)是用用数组来模拟树形结构.最简单的树状数组支持两种操作,时间复杂度均为 O ( log ⁡ ⁡ n ) O(\log⁡ n) O(log⁡n): ...

最新文章

  1. 背景图片等比缩放的写法background-size简写法
  2. k8s之CRD定义map[string]interface{}类型
  3. Vue.JS项目同时使用Element-UI与vue-i18n时实现国际化的方案
  4. C++ 11 新特性(十四)C++类
  5. C# 获取对象 大小 Marshal.SizeOf (sizeof 只能在不安全的上下文中使用)
  6. 平常代码练习报错问题解决
  7. webpack配置babel-loader
  8. DJANGO输出HIGHCHARTS数据的样例
  9. 51单片机驱动LCD1602显示原理及例程
  10. 配置ext邮箱服务器,Extmail实现邮件服务器
  11. android微信刷脸支付,安卓首发 Find X支持微信人脸支付功能
  12. 怎么缩小图片大小kb
  13. 什么是rip协议其优缺点_ospf和rip 优缺点
  14. TableOne数据分析工具
  15. down mark 打钩_Markdown 基本语法
  16. 关于COM中变体类型VARIANT
  17. git、github保姆级教程(手把手交)以及如何在github上提交pr,参与开源项目
  18. horizon服务主要模块_Horizon组件安装详解 - 远程连接OpenStack服务
  19. EBS R12多组织的实现原理
  20. 兼容IE 下载EXCEL

热门文章

  1. 【Ubuntu】安装Java和Eclipse
  2. Smali源代码分析教程(转)
  3. 更新ubuntu软件源
  4. MySQL配置文件my.cnf中文版
  5. WINCE6.0+S3C2443的启动过程---eboot5
  6. HTML常见小问题2
  7. 【搜遍互联网,集百家之长】环境配置从入门到放弃之Mac环境下,安装XAMPP,给phpstorm安装Xdebug调试工具...
  8. Eclipse Modeling Framework, 2nd Edition. (EMF)学习笔记(一)——EMF介绍
  9. Python学习笔记-DNS处理模块dnspython
  10. 309. Best Time to Buy and Sell Stock with Cooldown