首页 > 其他分享 >关于树状数组的一些思考

关于树状数组的一些思考

时间:2022-10-06 21:44:12浏览次数:53  
标签:数组 树状 lowbit 保存 思考 数据 100111000

在写题时看到大佬们对树状数组的精妙使用,故进一步思考树状数组中的规律和信息:

存袁术数据a[],   存树状数组数据 f[]

1、观察到f [i] 一定保存了a [i] 的数据

2、观察到f [i] 前面还有i个数据

3、观察到lowbit(i)可以表示f [i]中保存数据的个数

4、观察到每次减去lowbit(i) 相当于将声明当前lowbit(i) 个数已被使用,开始使用总数减去这些数后的数

5、同理,每次加上lowbit(i)相当于找到最近的能表示至少2 * lowbit(i)个数的数

思考:减去lowbit(i)和加上lowbit(i)是否在某种意义上等价?

  事实上是等价的;

  正常的顺序我们已经看过这里不再赘述

  我们观察下面的的一次更新:

    a[100111000] = k

    a[100110000] += k

    a[100100000] += k

    a[100000000] += k

  好像正确但又和我们理解的树状数组的更新不同

    我们尝试这样去理解

    a[100111001] ~ a[100111111]这些数均为0

    而我们添加的 a[100111000] = k

    实际上是a[100111000]  = k + {a[100111001] ~ a[100111111]}

    只不过后面的都是0

   这样的话我们每次减去一个lowbit(),产生一个最近的可以保存2 * lowbit()的位置,此位置正好可以将我们新增的所有数覆盖,故将新产生的数保存到这个位置

   这样虽然我们无法得到一个保存全部数据的数,但我们可以实现从后向前进行数据的保存而要想得到全部数据则需在得到1000···000时开始每次右移1,并保存所有数据最终得到答案

 

标签:数组,树状,lowbit,保存,思考,数据,100111000
From: https://www.cnblogs.com/leyuo/p/16758584.html

相关文章

  • Java稀疏数组
    publicclassArrayDemo8{/***稀疏数组*当一个数组中大多数元素为0或同一个值,可以用稀疏数组来保存这个数组*稀疏数组的处理方式*......
  • 如何做到长远思考?
    我们都知道做事情要长远考虑,而不是只注重眼前的利益。虽然我们都知道这一道理,但是许多人还是没办法做到这一点。我明白这个道理的时候很早,但同样是「许多大道理都懂,但就是做......
  • js数组去重大全,推荐收藏
    情境:将数组vararr=[1,1,‘true’,‘true’,true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,‘NaN’,0,0,‘a’,‘a’,{},{}];中重复的值......
  • C语言:字符数组相互赋值方法
    #include<stdio.h>#include<string.h>main(){charab[100]="asdfasd",ac[100];printf("%d%d\n",ab,ac);//ac=ab由于ab,ac分别为两个数组的起始地......
  • 波浪数组
    Description若对于除首尾位置之外的元素,每一个位置要么比两侧相邻的数字小,要么比两侧相邻的数字大,则称这样的数组为波浪数组现在有一个长度为\(n\)的数组,你每次操作......
  • numpy - 数组的切片
    导入数组的常用模块importnumpyasnp#创建一个多维数组arr=np.random.randint(0,100,size=(5,5))arr在这里,我们创建了一个五行五列的二维数组array([[1......
  • 数组和广义表
    n维数组和抽象数据类型ADTArray{数据对象:数据关系:基本操作:(1)InitArray(&A,n,bound1,。。。。,bound2)(2)Destroy(&A)(3)Value(A,&e,index1,。。。,indexn)取值(4)Assign(A,&e,index1,。。。......
  • 如何将一个 JavaScript 数组打乱顺序
    当我们想将现有的数组打乱顺序,有两个方法:1.Array.prototype.sort()数组的sort()方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串......
  • 1098. 城堡问题 flood fill算法 注意:第x行第y列对应的坐标为 (y,x) 与坐标为(x,y)
      1234567#############################1#|#|#||######---#####---#---#####---#2##|......
  • ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
    前记: jdk官方文档(javadoc)是学习的最好,最权威的参考。corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,​​LinkedBlockingQueue,​​​​ArrayBlockingQ......