樹狀陣列 講解

2022-05-10 20:34:36 字數 1189 閱讀 7385

樹狀陣列:(插點法  插線法)

最常見的一種用途是求乙個數列的前n項和

比如說陣列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[16]=a[1]+a[2]+....................+a[16]

也即c[n]管理著2^k個數 (k代表二進位制n最後連續有多少個0)  c[n]為這個連續2^k個數的最後乙個

因此有  c[n]=a[n-2^k+1]+.....+a[n];

則:2^k的簡單求法有:

int lowbit(int n)

return x&(-x);

(一):求前n項和有:

1.sum=0;

2.if(n<=0)  則求的結果 sum+=c[n]; 否則轉向第三步

3.n=n-lowbit(n);  轉向第二步

(二):求:修改乙個節點

eg:給第i個節點加上x

1.當i>n時,演算法結束,否則轉到第二步

2.c[i]+=x;,i+=lowbit(i);轉到第一步

(三):以上兩種情況都用到的時  樹狀陣列的--插點法

下面是   樹狀陣列--插線法:

比如:乙個陣列    操作:(i,j,k) 表示陣列從第i項到第j項的值都加上k

經過幾次操作之後 查詢某一項的值

這個問題使用樹狀陣列--插線法  速度非常快:

view code

1

int lowbit(int x)2 5

6void add(int i,int k)//

(i,j,k)這個操作 應用兩次add: add(i-1,-k),add(j,k)

7

13 }

1415

int search(int n)//

經操作之後查詢 第n項的值

16 23

return sum;

24 }

2526

27 add(i-1,-k);//

相當於把從第一項到第i-1項的值都減去k

28 add(j,k);//

相當於把從第一項到第j項的的值都加上k

29 search(n);

樹狀陣列 講解

樹狀陣列 binary indexed tree b.i.t 是乙個查詢和修改複雜度都為log n 的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改乙個元素的值 經過簡單修改可以在log n 的複雜度下進行範圍修改,但是這時只 請看下圖 我們令每個葉節點代表每乙個元素。現在我們變...

樹狀陣列(講解 模版)

樹狀陣列 如果給定乙個陣列,要你求裡面所有數的和,一般都會想到累加。但是當那個陣列很大的時候,累加就顯得太耗時了,時間複雜度為o n 並且採用累加的方法還有乙個侷限,那就是,當修改掉陣列中的元素後,仍然要你求陣列中某段元素的和,就顯得麻煩了。所以我們就要用到樹狀陣列,他的時間複雜度為o lgn 相比...

樹狀陣列入門 簡單的原理講解

樹狀陣列可以解決什麼樣的問題 這裡通過乙個簡單的題目展開介紹,先輸入乙個長度為n的陣列,然後我們有如下兩種操作 輸入乙個數m,輸出陣列中下標1 m的字首和 對某個指定下標的數進行值的修改 多次執行上述兩種操作 尋常方法 對於乙個的陣列,如果需要求1 m的字首和我們可以將其從下標1開始對m個數進行求和...