Binary Indexed Tree

 通常對於求數組的兩個操作:

   一、更新某個元素
   二、求數組中某個區間的元素的和
對於操作一,在O(1)可完成,對於操作二,在O(n)內可完成,但是如果操作二的次數很多,可能就比較耗時間了,所以這裏對於操作二提供另外一種方法,叫做Binary Indexed Tree,時間複雜度爲O(logn).
假設一共有N個元素,a[N]
這裏用一個輔助數組tree[N],數組下標從1開始
用tree[i]表示從數組a中某一處一直到a[i]共2k個元素的總和 即tree[i]=(a[i-2K+1]~a[i])的和, 而2K就是i的二進制表示中從右往左數的第一個1以及之後的0的十進制值,比如(1001000)2的(1000)2的十進制值爲8,即2K=8=i&(~i+1)
  如:在i= 1 0 1 0 1 0 0 0時
~i= 0 1 0 1 0 1 1 1
~i+1= 0 1 0 1 1 0 0 0
i&(~i+1)= 0 0 0 0 1 0 0 0 = (1000)2=8
例如     index       1             2             3             4             5             6             7             8
        index bit      1             10           11           100          101          110         111          1000 
            a             2             3             4             5             6             7             8             9
            tree         2             2+3          4        2+3+4+5      6             6+7          8             2+3+4+5+6+7+8+9
對於操作一,假設我們更新a[x],將其值加v,這樣,由於這個元素的改變,我們需要更新tree[N]數組中的相應元素
代碼如下:
 
對於操作二,如果想要求a[1]~a[x]的和,代碼如下:
 
a[i]~a[j]的和等於sum[j]-sum[i-1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章