1. 程式人生 > >樹狀陣列的單點更新,區間查詢。

樹狀陣列的單點更新,區間查詢。

基本的陣列陣列概念,樹狀陣列利用其特殊的位置可以用二進位制達到log級別的更新,如下圖
示意圖

核心程式碼

int sum(int i){
    int s = 0;
    while(i > 0){
        s += dat[i];
        i -= i&-i;
    }
    return s;
}
void add(int i,int x){
    while(i <= n){
        dat[i] += x;
        i += i&-i;
    }
}

lowbit的作用是求出最低位的那個1,為什麼這樣可以求出來呢,是因為計算機中是採用補碼的方式來儲存數值型資料,所以負數的補碼是原碼取反再+1,一個二進位制數取反後,後面如果現第一個1,那麼這位將變為0,而他後面的0都取反為1,所以再+1,就是這位變為1,而他後面的都變為0,這樣再與原來的數字進行與運算就能獲得
這裡有一個特殊的操作lowbit(x) = x&-x,通過這個操作我們就可以訪問到上一層或則下一層,當我們需要去求前3項的和時,只需要向下執行i -= lowbit(i)的操作就行了,從圖中你就會發現這正好就是前兩項的和再加上第三個和,確實就是如此的巧妙,同理我們更新的時候就是不斷向上去更新。因為這裡就利用了二進位制的巧妙,比如當我們在2的乘法的位置的數就就是前面全部的和然後它再減去它的lowbit就是0,因為他只有最高位是1,而非2的乘方的位置,他會一直向下去尋找,知道找到第一個乘方的位置,加起來就剛好是前n項的和。希望你能明白。