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

隨筆-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 楚天清秋 閱讀(504) 評論(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>
            伊人色综合久久天天五月婷| 亚洲精品乱码久久久久久蜜桃麻豆| 一区二区三区日韩欧美精品| 欧美国产高清| 美脚丝袜一区二区三区在线观看 | 欧美精品一区二区三区在线播放 | 国产九九精品视频| 欧美在现视频| 久久亚洲影音av资源网| 亚洲福利一区| 亚洲免费观看| 国产精品视频精品| 久久先锋资源| 欧美另类亚洲| 欧美综合国产| 免费欧美视频| 亚洲欧美中文字幕| 欧美在线国产精品| 99精品国产高清一区二区| 一区二区三区视频免费在线观看| 国产精品私人影院| 欧美成人一区在线| 欧美性大战久久久久久久蜜臀| 欧美亚洲免费电影| 美女视频一区免费观看| 亚洲中字黄色| 久久免费视频在线观看| 制服诱惑一区二区| 欧美在线视频在线播放完整版免费观看| 亚洲福利av| 国产精品高潮在线| 欧美成人精品在线| 国产精品激情偷乱一区二区∴| 裸体一区二区| 国产精品成人免费| 欧美激情中文字幕在线| 国产伦精品一区二区三区高清版| 嫩草影视亚洲| 国产日韩久久| 亚洲精品一区久久久久久| 国内精品美女av在线播放| 亚洲欧洲视频| 狠狠色狠狠色综合人人| 一区二区三区欧美成人| 亚洲人成人一区二区三区| 午夜视频在线观看一区| 亚洲视频高清| 欧美r片在线| 欧美sm视频| 国产一区二区三区最好精华液| 一区二区三区免费观看| 亚洲精品孕妇| 欧美高清免费| 亚洲第一在线综合在线| 国内视频一区| 欧美中文在线观看| 欧美一级二级三级蜜桃| 国产精品国产三级国产普通话三级| 欧美好吊妞视频| 亚洲国产电影| 久久亚洲捆绑美女| 欧美 日韩 国产 一区| 国内成人自拍视频| 久久黄色小说| 麻豆av一区二区三区| 国内久久精品| 久久久久久久波多野高潮日日| 欧美在线观看视频在线| 国产精品久久久久国产a级| 一本色道久久综合亚洲精品高清| 亚洲精品人人| 欧美久久成人| 99在线精品免费视频九九视| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲精品视频一区二区三区| 久久综合给合| 亚洲国产精品一区二区第四页av | 欧美福利电影在线观看| 欧美激情一区二区三区四区| 亚洲精品久久嫩草网站秘色| 欧美激情一区三区| 日韩一本二本av| 亚洲欧美变态国产另类| 国产精品视频xxxx| 欧美伊久线香蕉线新在线| 美女诱惑黄网站一区| 亚洲欧洲一区二区在线观看 | 久久成人免费网| 免费成人在线视频网站| 亚洲精选在线观看| 欧美亚洲成人网| 欧美中文字幕在线播放| 欧美日韩在线免费视频| 一区电影在线观看| 久久久久久久久综合| 亚洲国产精品尤物yw在线观看| 欧美精品一线| 午夜亚洲福利| 亚洲盗摄视频| 欧美一级片在线播放| 亚洲国产影院| 国产精品理论片在线观看| 久久久精品国产免费观看同学| 亚洲激情另类| 久久av在线看| 亚洲每日更新| 国内成人在线| 国产精品va在线播放| 久久免费视频这里只有精品| 亚洲狼人综合| 欧美jizz19hd性欧美| 亚洲欧美国产日韩天堂区| 亚洲国产精品传媒在线观看| 欧美性色aⅴ视频一区日韩精品| 久久久久看片| 亚洲一区视频在线| 亚洲啪啪91| 快she精品国产999| 午夜精品福利一区二区蜜股av| 黄色欧美成人| 亚洲作爱视频| 午夜精品福利在线观看| 亚洲第一精品福利| 午夜在线视频观看日韩17c| 亚洲第一精品在线| 久久精品二区三区| 一级日韩一区在线观看| 亚洲国产二区| 一区二区在线视频| 国产片一区二区| 欧美少妇一区| 欧美日在线观看| 欧美激情亚洲国产| 模特精品在线| 久久中文字幕导航| 久久精品国产一区二区三| 亚洲一区亚洲二区| 亚洲深夜福利在线| 一区二区三区|亚洲午夜| 最新国产乱人伦偷精品免费网站 | 在线观看亚洲精品视频| 国产伦精品一区二区三区高清| 国产精品国产三级国产普通话三级 | 欧美搞黄网站| 免费日韩av| 欧美国产高清| 亚洲国产精品久久久| 亚洲第一二三四五区| 欧美福利视频在线观看| 美日韩在线观看| 欧美成人精品一区| 亚洲福利在线观看| 亚洲激情午夜| 一本色道久久综合狠狠躁篇怎么玩| 最新日韩中文字幕| 99视频精品免费观看| 一区二区三区福利| 亚洲综合色丁香婷婷六月图片| 亚洲欧美激情四射在线日 | 国产精品久久久久久av福利软件 | 欧美亚洲自偷自偷| 久久精品国产欧美激情| 久久人人看视频| 欧美黄在线观看| 国产精品xxx在线观看www| 欧美日韩亚洲激情| 国产日韩欧美一区在线| 黄网动漫久久久| 亚洲三级免费观看| 亚洲欧美精品伊人久久| 久久精品二区三区| 亚洲第一精品影视| 亚洲午夜影视影院在线观看| 欧美一区二区三区在线看 | 日韩一级成人av| 一本色道久久综合狠狠躁篇的优点 | 亚洲一区二区三区精品在线| 午夜欧美大片免费观看| 久久精品亚洲| 欧美日韩视频在线一区二区观看视频| 国产精品播放| 亚洲国产精品999| 亚洲神马久久| 欧美~级网站不卡| 亚洲午夜一区| 蜜桃av综合| 国产精品一区二区三区久久久| 亚洲第一中文字幕| 艳妇臀荡乳欲伦亚洲一区| 久久精品成人欧美大片古装| 欧美激情影院| 午夜精品久久久久久| 欧美绝品在线观看成人午夜影视| 国产日韩av高清| 亚洲一区二区三区在线| 欧美成人午夜激情| 欧美一级在线亚洲天堂| 欧美日韩三区四区| 亚洲黄色在线看| 鲁大师成人一区二区三区|