樹狀陣列的基本用途是:維護序列的字首和。
基本思想是:對於給定的序列a,建立乙個陣列c,其中c[x]儲存序列a在區間[x-lowbit(x)+1, x]中所有數的和。
int
lowbit
(int x)
//返回lowbit的位數
可以想象乙個樹形結構(如果n不是2的整數次冪,則為森林結構)。
每個內部節點c[x]儲存以它為根節點的子樹中所有葉子節點的和。
每個內部節點c[x]的子節點的個數等於lowbit(x)的位數。
除了根節點外,每個內部節點c[x]的父節點是c[x+lowbit(x)]。
樹的深度是o(logn)。
這個樹結構支援兩種操作:
查詢字首和:o(logn)
求出[1, x]的值。如果需要[l, r]的值,可以使用ask(r )-ask(l -1 )查詢。
int
ask(
int x)
單點增加值:o(logn)
給a[x]加上數值y。
可以用add操作來進行初始化——新建全0的陣列c,給每個位置x執行操作add(x, a[x])。這樣初始化得時間複雜度為o(nlogn)。
void
add(
int x,
int y)
資料結構 樹狀陣列筆記
樹狀陣列 binary indexed tree,bit c i 存放的是在i號之前 包括i號 lowbit i 個整數的和 即 c i 的覆蓋長度是lowbit i 樹狀陣列的下標必須從1開始 int getsum int x void update int x,int v 經典應用 統計序列中在...
資料結構 樹狀陣列
區間資訊的維護與查詢專題 樹狀陣列 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 是...