樹狀陣列:(插點法 插線法)
最常見的一種用途是求乙個數列的前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
1int 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個數進行求和...