1. 程式人生 > >學習筆記1-回顧樹狀數組與莫隊思路

學習筆記1-回顧樹狀數組與莫隊思路

size height 數據結構 sdn csdn net 復雜 ron 時間復雜度

今天回顧了一下樹狀數組的有關內容。

可以說是今天才看懂樹狀數組的意思吧。。對之前的理解毫無印象..

現在這裏馬克一下

樹狀數組:

樹狀數組是用於存儲數據的一種特殊的數據結構。具體的形狀如下圖:

技術分享

a數組是我們宏觀普遍出現的數組形式,c就是相對的樹狀數組。

二進制條件下:

a[0]到a[1110]的和=c[1110]+c[0110]+c[0010];

修改a[1]時,受到影響的有c[1],c[10],c[100],c[1000].....

對於這樣的運算,我們用到了&來計算。

lowbit();的作用是去掉高位1 (1100就是0100,1110就是0010,1000就是本身)

lowbit(k)=k&-k;

所以修改和讀取的操作分別是:

void add(int k,int num)  
{  
    while(k<=n)  
    {  
        tree[k]+=num;  
        k+=k&-k;  
    }  
}  //修改
int read(int k)//1~k的區間和  
{  
    int sum=0;  
    while(k)  
    {  
        sum+=tree[k];  
        k-=k&-k;  
    }  
    return sum;  
}  //讀取

當然,有一些時候數據會讓你難以使用樹狀數組。比如,求區間中不同的數的個數(多次修改,多次詢問),這個時候就可以用莫隊來解決了~~

等我看完莫隊再來補筆記....

樹狀數組時間復雜度O(lg n)

學習筆記1-回顧樹狀數組與莫隊思路