資料結構 Binary Indexed Tree

2021-08-20 07:25:34 字數 1833 閱讀 6923

二叉索引樹 《樹狀陣列》

假設我們有n個盒子,該資料結構就可以使我們快速的進行以下兩個操作:

1.第i個盒子的增改                          《更改點資料》

2.第k個到第i個盒子資料的累加和    《區間求值》

時間複雜度均為 o(logn)

核心思想:二分法

其主要由三個函式構成:

int lowbit(int x)

/*與資料索引相關聯*/

int sum(int x)

return amount;

}/*計算 1 - x 段的和*/

void updata(int x,int val)

}/*增改資料*/

首先我們把目光放在第乙個函式lowbit,我們都知道計算機裡面,整數都是使用補碼來表示,假設x為7的話 ,那麼它的二進位制就是0111,而-x就是其取反加1的結果,也就是1001那將他們相與的結果就是0001,這就是該函式的結果。而它的作用將會在下兩個函式中起到畫龍點睛的作用。

現在,我們知道了lowbit函式所能夠帶來的結果,但它的真正意義是什麼呢?筆者也百思不得其解,但研究上圖,以及聯絡**來看,其主要是起聯絡和簡化的作用(本人拙見,望諸君指點)

讓我們通過這樣一組資料來繼續進行了解。明白兩個概念

概念1.對於每乙個結點 i ,如果它是左子節點其父節點為 i+lowbit ,若為右,則為 i - lowbit.

概念2.每乙個tree陣列的值都對應      一段連續和.

看上圖的虛線和深色點,將其相連是不是一顆二叉樹。tree陣列裡包含的就是結點的資料

再結合概念2也就不難明白tree的值了。

舉個栗子了解updata函式,如果我們對 第3結點 進行 +1 操作,我們發現,這並不只是單單加一這麼簡單,對其進行操作對後面的tree陣列的值也有影響,所以,也要將與之關聯的進行同樣的+1操作。

(操作後 影響的結果)

sum函式值的計算同樣是基於這一點,我們仍然用7來舉栗子

7的二進位制是0111 根據**先累加7結點的資料,再回溯累加6的,再回溯累加4的,結束,返回值。

可能有讀者會問,為什麼要回溯6,4?

7(0111) 的lowbit 為1 減之為6

6(0110) 的lowbit 為2 減之為4

4(0100) 的lowbit 為4 減之為0   結束

這樣,在普通陣列需要7次操作的運算,通過這種方法只需要3次就足夠了,可以說是極大的優化

從巨集觀角度來說就是將其代表的線段和累加,而這也是基於二分之上所做的。

topcoder

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...