樹狀陣列最大的特點就是求解特定區間的元素的和操作時間複雜度小o(lgn),現對於傳統的順序求和的操作樹狀陣列在求解過程中採用了二進位制的思想,巧妙地化解了多次求和的重複操作,在很大程度上提高了效率。
上圖是樹狀陣列的儲存於求解過程,給出的很詳細,陣列a存放的是原始的需要求和的元素,陣列c存放的是利用二進位制儲存的各部分的和。
在控制各部分求和的過程中有這樣的過程操作,
c1 = a1
c2 = a1 + a2
c3 = a3
c4 = a1 + a2 + a3 + a4
c5 = a5
c6 = a5 + a6
c7 = a7
c8 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
…… c16 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16
所採用的計算過程是主要是二進位制思想;
其中求二進位制操作的過程可用下面操作完成
int lowbit(int x)
其次在儲存的過程中還需要乙個操作來初始化陣列c
void change(int i,int x)
}再輸入陣列a的同時就需要對陣列c進行初始化,以及進行後續的與ci相關聯的c陣列元素進行修改,以保證c陣列中儲存的一直都是最新的變更之後的值,此外對於初學者,在看這部分的時候可能會有點迷惑,所以可以嘗試在每一次變更的過程中檢視i的值的變化,來更好的理解其中變化的規律。
其次最終額操作就是求前i項的和的操作了,
int sum(int x)
return sum;
}與上邊change操作的相似度很大,只不過是 x-=lowbit(x);這個操作的目的是保證取出陣列c中x之前的元素的和.
學習總結之樹狀陣列
樹狀陣列和線段樹聽說是區分acmer和其他人的重要區別,嘿嘿嘿。樹狀陣列總體而言可以總結為乙個很簡單的問題複雜化,但是時間簡單化。問題的引入 給定n個數,a 1 a n 每次我們可能有兩種操作 1 求出a i a j 的和 2 給a x 的值加上乙個值val。n的規模如果比較大 約100000 該如...
樹狀陣列總結
樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...
樹狀陣列總結
樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...