一維樹狀陣列中的元素是某乙個區間內的n個元素和,對於n的值,用二進位制位和圖形結合則更容易理解。
c1 : 0 0 0 1 —— 1個元素
c2 : 0 0 1 0 —— 2個元素
c3 : 0 0 1 1 —— 1個元素
c4 : 0 1 0 0 —— 4個元素
…………
自己多寫幾個會容易發現:cn內的元素個數是n的二進位制表示形式的最低位1構成的數。例如:4和12的二進位制位最低位的1都是在右數第三位上,c4和c12都包含了3個元素的和。
根據c[n]陣列的性質,在輸入或者更新元素的時候,要更新第x個元素時還要注意更新包含第x元素的項,所有包含這個元素的項都是最低位1比這個更高的位的項。
在求和的時候,c[x]表示的是x & (-x)個元素,再加上c[x - x & (-x)]就是之前的一段區間和,這樣一直加到,x 為 0時結束。
求最低位的1的方法:
x & (-x)
int lowbit(int x)
更新元素的方法:找更高位,x + x & (-x)就能找到更高位
void update(int x, int num)
}
對於求和的方法:c[x]表示部分區間和,還要求x - x & (-x)個元素的和就ok,迴圈直到x == 0
int
sum(int x)
return s;
}
一維樹狀陣列
2013 05 30 20 54 329人閱讀收藏 舉報 一維陣列相信大家平時都是經常使用,對於一維陣列而言,查詢以及求和的時間複雜度分別為o 1 和 o n 今天我們介紹乙個新的資料結構 樹狀陣列英文名稱為binary index tree,直譯過來就是二進位制索引樹,我覺得二進位制索引樹更能說明...
一維樹狀陣列和二維樹狀陣列
hdu1166敵兵布陣 樹狀陣列適用於頻繁對陣列元素進行修改,同時又要查詢陣列內任一區間元素之和。聽說線段樹也可以做,線段樹的作用 點修改,區間查詢,區間修改。include include include include using namespace std int a 50005 int c ...
從一維樹狀陣列到二維樹狀陣列
今天接觸二維樹狀陣列。其實,要明確的一點是,不管是一維還是二維樹狀陣列,都只是工具而已,只是幫助我們更快地求和,查詢,樹狀陣列的這些操作都可以用我們平常的方法求,例如一直加。面對乙個二維陣列,我們要求它們的和,會怎麼做呢?先求出第一行的總和 再求出第二行的總和 再求出第三行的總和 求出最後一行的總和...