您的位置:首页 > 其它

树状数组学习

2012-08-06 11:53 190 查看
树状数组使用实际的静态数组,模拟树的形状。

下面是树状数组的构成:



树状数组结点直接的关系:

子->父关系:

c1 -> c2 -> c4 -> c8(由二进制可知:1, 10, 100, 1000)

c3 -> c4 -> c8(二进制:11,100,1000)

c5 -> c6 -> c8(二进制:101,110,1000)

c7 -> c8(二进制:111 -> 1000)

父 = 子 + lowbit(子)

父->子关系:

cn = (n ——(n - lowbit(n)+ 1 );

两种运算:

1.更改值

dif = after - init = 更新值- 初始值

while(i <= n){
   c[i] += val;
   i += lowbit(i);
}


复杂度O(logn)

2.询问和

例如:

sum[6] = c[6] + c[4];

110 = 10 + 100;

while(i > 0){
    sum += c[i];
    i -= lowbit[i];
}


复杂度O(logn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: