树状数组的基础知识

树状数组的原理是:任意一个数都能被一个独有的二进制数表示。基于此,对于一个区间[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。

树状数组的形状:

树状数组的基础知识_第1张图片

 

其中,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)。

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

你可能感兴趣的:(树状数组的基础知识)