資料結構 樹狀陣列 筆記

2021-10-08 06:01:08 字數 743 閱讀 5094

樹狀陣列的基本用途是:維護序列的字首和

基本思想是:對於給定的序列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 是...