樹狀陣列理論基礎

2021-08-21 18:03:59 字數 1463 閱讀 1279

樹狀陣列(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...