线段树

算法笔记 - 树状数组 (Fenwick tree)

2018-12-18  本文已影响0人  袁旭程

功能描述

对于一个长度为N数组array

注意事项

算法的结构

image.png

函数lowbit在树状数组中操作的说明

lowbit函数的作用是找到数字二进制的最后一个数字1。举例

x_{10} x_{2} lowbit(x)_{2} lowbit(x)_{10}
5 101 1 1
6 110 10 2
10 1010 10 2
20 10100 100 4
22 10110 10 2
27 11011 1 1
路径图

加上lowbit数值 的作用,是找到最近的父亲节点。在修改点 P_{5} 的数值是,父亲的寻找过程是:

减去lowbit的数值的作用,是找到每一个需要被统计的子树的根节点。 是上图红色标志的路线。对于sum(1, 11)的数值,分别有三个子树需要被计算进来

示范代码

C语言实现,来自维基百科。但是这里我修改了一点点,size放大了1, 更方便理解。数值的存储是 [1, SIZE]

#define LSB(i) ((i) & -(i)) // zeroes all the bits except the least significant one

int A[SIZE+1];

int sum(int i) // Returns the sum from index 1 to i
{
    int sum = 0;
    while (i > 0) 
        sum += A[i], i -= LSB(i);
    return sum;
}
 
void add(int i, int k) // Adds k to element with index i
{
    while (i <=SIZE) 
        A[i] += k, i += LSB(i);
}

题目

leetcode 的 683 - k-empty-slots可以使用树状数组实现

上一篇下一篇

猜你喜欢

热点阅读