青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-22  評論-7  文章-0  trackbacks-0

【引言】

          在解題過程中,我們有時需要維護一個數組的前綴和S[i]=A[1]+A[2]+...+A[i]。

          但是不難發現,如果我們修改了任意一個A[i],S[i]、S[i+1]...S[n]都會發生變化。

          可以說,每次修改A[i]后,調整前綴和S[]在最壞情況下會需要O(n)的時間。

          當n非常大時,程序會運行得非常緩慢。

          因此,這里我們引入“樹狀數組”,它的修改與求和都是O(logn)的,效率非常高。

【理論】

          為了對樹狀數組有個形 象的認識,我們先看下面這張圖。


          如圖所示,紅色矩形表示的數組C[]就是樹狀數組。

          這里,C[i]表示A[i-2^k+1]到A[i]的和,而k則是i在二進制時末尾0的個數,

          或者說是i用2的冪方和表示時的最小指數。

         ( 當然,利用位運算,我們可以直接計算出2^k=i&(i^(i-1)) )

          同時,我們也不難發現,這個k就是該節點在樹中的高度,因而這個樹的高度不會超過logn。

          所以,當我們修改A[i]的值時,可以從C[i]往根節點一路上溯,調整這條路上的所有C[]即可,

          這個操作的復雜度在最壞情況下就是樹的高度即O(logn)。  

          另外,對于求數列的前n項和,只需找到n以前的所有最大子樹,把其根節點的C加起來即可。

          不難發現,這些子樹的數目是n在二進制時1的個數,或者說是把n展開成2的冪方和時的項數,

          因此,求和操作的復雜度也是O(logn)。

          接著,我們考察這兩種操作下標變化的規律:

          首先看修改操作:

          已知下標i,求其父節點的下標。
          我們可以考慮對樹從邏輯上轉化:

         如圖,我們將子樹向右對稱翻折,虛擬出一些空白結點(圖中白色),將原樹轉化成完全二叉樹。

         有圖可知,對于節點i,其父節點的下標與翻折出的空白節點下標相同。

         因而父節點下標 p=i+2^k  (2^k是i用2的冪方和展開式中的最小冪,即i為根節點子樹的規模)

         即  p = i + i&(i^(i-1)) 。

         接著對于求和操作:

         因為每棵子樹覆蓋的范圍都是2的冪,所以我們要求子樹i的前一棵樹,只需讓i減去2的最小冪即可。

         即  p = i - i&(i^(i-1)) 。

        

         至此,我們已經比較詳細的分析了樹狀數組的復雜度和原理。

         在最后,我們將給出一些樹狀數組的實現代碼,希望讀者能夠仔細體會其中的細節。

【代碼】

 求最小冪2^k:

int LowBit(int n)
{
    return n & (-n);
}
求前n項和:
int Sum(int nPos)
{
    int nSum = 0;
    while (nPos > 0)
    {
        nSum += C[nPos];
        nPos -= LowBit(nPos);
    }

    return nSum;
}
對某個元素進行加法操作:
void Modify(int nPos, int delta)
{
    while (nPos <= DATA_SIZE)
    {
        C[nPos] += delta;
        nPos += LowBit(nPos);
    }
}

以下代碼是樹狀數組和普通加法的比較代碼(VC6.0編譯)
#include <iostream.h>
#include 
<stdlib.h> 
#include 
<malloc.h>
#include 
<windows.h>

#define DATA_SIZE 10000000

int A[DATA_SIZE];
int C[DATA_SIZE];

int LowBit(int n)
{
    
return n & (-n);
}



// Binary Indexed tree
int Sum1(int nPos)
{
    
int nSum = 0;
    
while (nPos > 0)
    
{
        nSum 
+= C[nPos];
        nPos 
-= LowBit(nPos);
    }


    
return nSum;
}


void Modify(int nPos, int delta)
{
    
while (nPos <= DATA_SIZE)
    
{
        C[nPos] 
+= delta;
        nPos 
+= LowBit(nPos);
    }

}


// Common Plus
int Sum2(int nPos)
{
    
int nSum = 0;
    
for ( int i=1; i<DATA_SIZE; i++ )
    
{
        nSum 
+= A[i];
    }


    
return nSum;
}



main()
{

    DWORD dwBegin,dwEnd;
    dwBegin 
= dwEnd = GetTickCount();

    
int nIndexChanged = 10;
    
int nData = 100;

    A[nIndexChanged] 
= nData;
    Modify(nIndexChanged,nData);

    
int nSum = Sum1(DATA_SIZE-1);
    cout
<<nSum<<endl;
    dwEnd 
= GetTickCount();
    
int nDiff = dwEnd-dwBegin;
    cout
<<"Time1:"<<dwEnd-dwBegin<<endl;
    cout
<<"---------------------"<<endl;

    dwBegin 
= dwEnd = GetTickCount();
    nSum 
= Sum2(DATA_SIZE-1);
    cout
<<nSum<<endl;
    dwEnd 
= GetTickCount();
    nDiff 
= dwEnd-dwBegin;
    cout
<<"Time2:"<<nDiff<<endl;
    cout
<<"---------------------"<<endl;
    
    
return 0;
}


posted on 2010-05-31 14:48 楚天清秋 閱讀(499) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美三级资源在线| 亚洲一线二线三线久久久| 欧美精品一区在线| 欧美高清视频一区| 欧美三区在线| 国产精品午夜久久| 国一区二区在线观看| 亚洲国产专区校园欧美| 亚洲乱码日产精品bd| 欧美大片一区二区| 国产精品欧美一区喷水| 国产一区美女| 亚洲精品影院在线观看| 亚洲国产欧美在线人成| 国产欧美日韩另类一区| 国产亚洲成av人在线观看导航| 国产精品色网| 91久久国产精品91久久性色| 夜夜嗨一区二区| 亚洲一区图片| 免费在线成人| 亚洲自拍16p| 欧美91视频| 国产一区欧美日韩| 亚洲一区二区在线免费观看视频 | 欧美激情一区二区三区 | 国产精品视频一| 91久久久精品| 欧美诱惑福利视频| 亚洲精品之草原avav久久| 亚洲综合大片69999| 欧美成人一区二免费视频软件| 在线视频亚洲| 欧美精品在线观看| 1000部精品久久久久久久久| 亚洲在线不卡| 亚洲精品日产精品乱码不卡| 久久久久一区二区| 国产三级欧美三级日产三级99| 一本大道久久精品懂色aⅴ| 欧美激情一区在线| 久久久国产成人精品| 国产精品xnxxcom| 一本色道久久综合亚洲精品小说| 媚黑女一区二区| 欧美中文字幕视频| 国产日韩欧美在线播放不卡| 亚洲男人第一av网站| 亚洲毛片在线看| 欧美日韩的一区二区| 亚洲精品免费在线播放| 欧美福利视频在线| 免费欧美日韩| 亚洲免费不卡| 亚洲精品你懂的| 欧美在线视屏| 国产日韩一区二区| 国产日韩欧美麻豆| 欧美与欧洲交xxxx免费观看| 一区二区三区视频在线播放| 欧美视频在线观看一区| 亚洲图片欧美日产| 亚洲网址在线| 国产亚洲一区精品| 久久综合中文| 久久综合九色| 性欧美在线看片a免费观看| 夜夜爽www精品| 欧美一区二区私人影院日本| 久久国产成人| 久久久久久久性| 亚洲激情在线| 一本大道久久精品懂色aⅴ| 欧美视频在线观看一区| 欧美一区二区三区视频在线| 欧美中文在线视频| 亚洲毛片av| 亚洲免费在线播放| 很黄很黄激情成人| 亚洲啪啪91| 国产嫩草影院久久久久| 久久综合综合久久综合| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲美女中文字幕| 性色一区二区| 99亚洲一区二区| 性欧美video另类hd性玩具| 久久精品亚洲一区二区三区浴池 | 亚洲第一色在线| 亚洲国产欧美精品| 国产精品综合色区在线观看| 久久在线免费观看| 国产精品www.| 亚洲国产精品悠悠久久琪琪| 欧美性猛交xxxx乱大交蜜桃| 久久久噜久噜久久综合| 欧美一二三区在线观看| 欧美成人免费小视频| 国产精品二区在线观看| 免费久久久一本精品久久区| 欧美午夜理伦三级在线观看| 可以免费看不卡的av网站| 欧美日本精品在线| 猛干欧美女孩| 国产一区二区三区黄| 夜夜嗨av一区二区三区| 亚洲精品美女在线观看| 久久久亚洲欧洲日产国码αv| 一区二区三区四区五区精品| 久久天堂成人| 久久久久久9| 国产美女扒开尿口久久久| 亚洲精品免费在线| 最新中文字幕一区二区三区| 午夜欧美电影在线观看| 国产伦精品一区二区三区四区免费 | 欧美中文字幕视频| 性久久久久久久久久久久| 国产精品麻豆成人av电影艾秋| 宅男噜噜噜66一区二区 | 欧美aⅴ一区二区三区视频| 欧美va天堂| 欧美在线一二三区| 欧美视频在线一区| 亚洲毛片视频| 99re6这里只有精品视频在线观看| 久久久久九九九九| 久久久综合香蕉尹人综合网| 国产精品一二三| 亚洲一区二区三区免费视频 | 久久在线视频在线| 国产精品网站在线观看| 亚洲视频久久| 亚洲欧美一区二区三区极速播放| 欧美日韩国产精品成人| 91久久在线| 亚洲免费福利视频| 欧美久久一级| 亚洲女人天堂成人av在线| 欧美激情在线免费观看| 亚洲国产精品免费| 99视频+国产日韩欧美| 欧美日韩国产在线观看| 亚洲美女视频网| 午夜精彩视频在线观看不卡 | 国产欧美 在线欧美| 亚洲免费视频一区二区| 久久精品在线| 亚洲高清毛片| 欧美精品在线视频| 国产亚洲欧美激情| 国产精品影音先锋| 亚洲美女性视频| 欧美日韩蜜桃| 亚洲一级电影| 久久久www成人免费精品| 黄色成人精品网站| 免费国产一区二区| 日韩视频在线观看免费| 亚洲女人天堂成人av在线| 国产欧美日韩在线观看| 久久久久久久久久久成人| 亚洲国产成人午夜在线一区 | 狠狠做深爱婷婷久久综合一区| 久久久久久一区二区三区| 亚洲激情一区二区| 欧美在线播放高清精品| 樱桃成人精品视频在线播放| 亚洲国产高清aⅴ视频| 亚洲欧美日韩国产中文在线| 国模私拍视频一区| 欧美日韩性生活视频| 欧美一区国产在线| 欧美激情在线播放| 午夜一区在线| 亚洲精品久久嫩草网站秘色| 国产精品久久夜| 免播放器亚洲一区| 午夜国产不卡在线观看视频| 欧美国产精品久久| 欧美怡红院视频一区二区三区| 久久综合亚州| 在线视频国内自拍亚洲视频| 国产精品r级在线| 免费不卡在线观看| 亚洲高清不卡在线观看| 亚洲美女视频在线观看| 久久亚洲一区二区| 午夜视频久久久| 亚洲免费观看高清完整版在线观看熊 | 久久精品欧美| 亚洲一本大道在线| 亚洲三级国产| 美女性感视频久久久| 翔田千里一区二区| 亚洲免费视频成人| 日韩视频在线免费观看| 亚洲电影免费在线观看| 久久精品一区二区三区不卡牛牛| 一区二区三区欧美激情|