1. 程式人生 > >樹狀數組簡述

樹狀數組簡述

turn 簡述 樹狀數組 pos 一次 oid mage mil add

樹狀數組是一種單點修改並查詢前綴和的數據結構

查詢和修改時間復雜度都是log(n)

對於樹狀數組我們首先需要知道lowbit的概念

lowbit即是x & -x

通俗點是一個數二進制下的從後往前數第一個1所對應的值

技術分享圖片

具體算法的話就是兩個

一個是修改函數如下

void add(int pos, int w)

{

while(pos <= n)

{

c[pos]+=w;

pos+=lowbit(pos);

}

}

一個是查詢如下

int sum(int pos)

{

int ret = 0;

while (pos > 0)

{

ret+=c[pos];

pos-=lowbit(pos);

}

return ret;

}

很好寫也易於理解

我第一次自己寫的時候初始賦值錯了導致初始化復雜度過大

可以初始賦值的時候就使用add( i , a[i] )

樹狀數組簡述