树状数组的基础知识

Posted qianr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的基础知识相关的知识,希望对你有一定的参考价值。

树状数组的原理是:任意一个数都能被一个独有的二进制数表示。基于此,对于一个区间[1,x],树状数组将其分解为logx个区间,从而快速询问区间和。

树状数组的每个子区间的共同特点是:若区间结尾为R,则区间长度就等于R的“二进制分解下”最小的2的次幂,设为lowbit(R)。

lowbit(R)表示的是区间长度。

lowbit的求法:

举个例子:求7的lowbit值:7的二进制分解为111,其中最低一位出现1的位为第一位,所以7的lowbit值即为1。

     求6的lowbit值:6的二进制分解为110,其中最低一位出现1的位为第二位,所以6的lowbit值为10即2。

     求8的lowbit值:8的二进制分解为100,其中最低一位出现1的位为第三位,所以8的lowbit值为100即8。

树状数组的形状:

技术图片

 

其中,A数组存储的是原数组,C数组(即树状数组)存储的是[x-lowbit(x)+1,x]中所有数的和(如6的lowbit值为2,则C[6]存储的 便是A[6-2+1,6]的值即为A[5]+A[6]的值)。

树状数组的性质:

①每个内部结点c[x]保存以它为根的子树中所有子节点的和。

②每个内部结点c[x]的子节点个数等于lowbit(x)的大小。

③除树根外,每个内部节点c[x]的父节点是c[x+lowbit(x)]。

④树的深度为O(logN)。

以上便是树状数组的基本知识。

以上是关于树状数组的基础知识的主要内容,如果未能解决你的问题,请参考以下文章

树状数组知识点详解

树状数组基础

树状数组 基础知识——C++数据结构

如何在原数组的基础上生成树状数组

树状数组的知识总结

树状数组区间更新