筆者在做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 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...