資料結構 樹狀陣列

2021-10-08 01:50:49 字數 1080 閱讀 8151

筆者在做leetcode時,遇到了乙個較為棘手的題目,其題目描述如下所述:

樹狀陣列即為使用陣列對樹狀機構進行模擬,其主要用於求解區間求和和更新問題。

其結構如下圖所示:

其中,a為原陣列,c即為建立的樹狀陣列,可看到樹狀陣列可以很方便的對區間內的值進行求和及更新。

樹狀陣列的節點與原陣列一一對應,並通過觀察可發現:

c[1] = a[1]

c[2] = a[1] + a[2]

c[3] = a[3]

c[4] = a[1] + a[2] + a[3] + a[4]

c[5] = a[5]

c[6] = a[1] + a[2] + a[3] + a[4] + a[6]

更一般的可以發現c[i] = a[i-2k+1] + a[i-2k+2]…+a[i]

其中k為i的二進位制中從最低位到高位連續零的長度,例如8->1000,則k=3。

所以通過樹狀陣列可以對陣列的區間進行快速的求和,例如:sum[i] = c[i] + c[i-2k1] + c[(i-2k1)-2k2] + …

但緊跟著的問題是,k該如何求出?

在此處不得不佩服前人的智慧型,即2k = i&(-i),利用計算機中負數儲存為補碼的特性,可以分析得出(奇數、偶數分別討論)。

vector<

int> a;

vector<

int> c;

//初始化樹狀陣列

void

init

(int x)

//獲取每一步的2^k

intlowbit

(int pos)

//更新節點

void

upgrade

(int pos,int k)

}//區間求和的查詢

intquery

(int pos)

return result;

}

資料結構 樹狀陣列

區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...

資料結構 樹狀陣列

原陣列 字首和 範圍和 原陣列更改陣列元素在求和效率較低,引入樹狀陣列 假設原陣列a 樹狀陣列c 樹狀陣列 的三種操作 1.lowbit 子葉數 二進位制最低位的1代表多少 實現 int lowbit int n 求 lowbit x returnx x 2.update a i k 假設a i 是...

資料結構 樹狀陣列

講到了線段樹,那就順便講講樹狀陣列吧。假設乙個長度為 12 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...