樹狀陣列(binary indexed trees,二進位制索引樹),最早由peter m. fenwick於2023年以「a new data structure for cumulative frequency tables"為題發表在software practice and experience。其初衷是解決資料壓縮裡的累積頻率(cumulative frequency)的計算問題,現多用於高效計算數列的字首和(∑a[i]).它可以以o(㏒n)的時間得到(∑a[i]),並同樣以o(㏒n)的時間執行對某項加乙個常數的操作。
核心思想
1)樹狀陣列中的每乙個元素是原陣列中的乙個或者多個連續元素的和。
2)在進行連續求和操作a[1]+a[2]+....+a[n]時,只需要將樹狀陣列中某幾個元素進行求和。
3)在對某乙個元素進行修改時,也只需要修改樹狀陣列中某幾個元素的和即可。
樹狀陣列的結構
1)a是原始資料的樹狀陣列。
2)陣列e表示樹狀陣列。圖中任意乙個元素e[i]是由多個或乙個a中的元素的和構成的。
例如,e[1]=a[1],e[4]=e[2]+a[3]+a[4]=e[1]+e[2]+e[3]+e[4].
3)如果數字i的二進位制表示中末尾有k個連續的0,則e[i]是a陣列中連續2的k次方個元素的和,
即e[i]=a[i-2^k+1]+a[i-2^k+2]+....+a[i].
4)e中元素的後繼(為節點的父親節點):結點的後繼是比它大的,最近的且編號末尾連續0比e多的結點。
5)e中元素的前驅:結點的前驅為比e小的,最近的且末尾連續0的個數比e多的結點。前驅主要計算連續的和。
例如,sum(7)=a[1]+a[2]+...+a[7]=e[7]+e[6]+e[4]
基本操作!!!!
1.預備函式 lowbit(int)
從基本概念可以知道,樹狀陣列最基本的操作就是找到前驅和後繼。通過lowbit()函式可以非常簡單地找到前驅和後繼結點。
lowbit()函式是返回將引數轉化為二進位制數後最後乙個1所在的位置,此位置轉化為十進位制後的值。例如,34轉化為二進位制
為100010,最後乙個1在第二位,所以lowbit返回值為2.
參考**
int lowbit(int k)
2.修改某一元素的值
將a[k]的值增加v,需要把e[k]以後的後繼結點全部增加k,一直到len(最大長度)。
#define len 10000
int e[len];
void add(int k,int v) }
三。求原始資料前k項的和
只需把e[k]以及其前驅結點的值累加即可。
int sum(int k)
return re;}
推薦例題:hdu 1166
其他例題可檢視我的樹狀陣列分類
TCP IP理論基礎
一 tcp ip的分層模型 osi協議參考模型,它是基於國際標準化組織 iso 的建議發展起來的,它分為7個層次 應用層 表示層 會話層 傳輸層 網路層 資料鏈路層及物理層。這個7層的協議模型雖然規定得非常細緻和完善,但在實際中卻得不到廣泛的應用,其重要的原因之一就在於它過於複雜。但它仍是此後很多協...
TCP IP理論基礎
linux中網路棧的介紹一般分為四層的internet模型。分別為應用層 傳輸層 網際層和網路介面。tcp ip實際上是乙個協同工作的通訊家族,為網路資料通訊提供通路。為方便將tcp ip協議族大致上分為三部分 1.internet協議 ip 這一部分也稱為網路層。主要包括ip icmp和arp。其...
SCM理論基礎
在乙個大型的專案中,會有很多人員,比如說專案管理者 開發人員等,人多的情況下,很可能就會在及時溝通 管理等方面出現問題,具體可以總結為 這些問題的存在,不僅會使我們的開發效率很低,做出來的產品質量也會受影響。有了scm,就很好的解決了這些問題。scmsoftwareconfiguration man...