一維樹狀陣列

2021-08-15 03:38:03 字數 876 閱讀 4395

一維樹狀陣列中的元素是某乙個區間內的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 ...

從一維樹狀陣列到二維樹狀陣列

今天接觸二維樹狀陣列。其實,要明確的一點是,不管是一維還是二維樹狀陣列,都只是工具而已,只是幫助我們更快地求和,查詢,樹狀陣列的這些操作都可以用我們平常的方法求,例如一直加。面對乙個二維陣列,我們要求它們的和,會怎麼做呢?先求出第一行的總和 再求出第二行的總和 再求出第三行的總和 求出最後一行的總和...