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

隨筆-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>
            亚洲精品视频啊美女在线直播| 亚洲午夜一区二区三区| 亚洲国产欧美在线人成| 国产亚洲亚洲| 国产一区二区三区奇米久涩 | 亚洲主播在线观看| 中日韩高清电影网| 亚洲欧美日韩一区二区三区在线| 亚洲网站在线播放| 亚洲一级黄色片| 亚洲在线中文字幕| 亚洲欧美综合国产精品一区| 欧美一区二区精品在线| 欧美一区二区三区婷婷月色| 久久久噜噜噜久久| 欧美国产欧美综合 | 欧美黄色小视频| 国产精品草莓在线免费观看| 国产日本亚洲高清| 韩国av一区二区三区四区| 亚洲激情亚洲| 亚洲欧美成人在线| 久久亚洲综合色| 亚洲国产一区二区三区在线播 | 欧美在线日韩| 老司机aⅴ在线精品导航| 亚洲精品免费在线播放| 亚洲视频免费在线观看| 久久久久久久久久码影片| 欧美另类在线播放| 亚洲国产天堂网精品网站| 亚洲女人天堂成人av在线| 蜜桃av一区二区| 国产精品国产亚洲精品看不卡15| 国产一区美女| 日韩天堂在线视频| 激情综合视频| 在线亚洲精品| 免费日韩av电影| 久久国产乱子精品免费女| 亚洲电影观看| 欧美亚洲网站| 国产精品久久久久久久久久直播| 亚洲福利免费| 久久riav二区三区| 日韩亚洲不卡在线| 欧美电影美腿模特1979在线看| 国产一二三精品| 亚洲综合三区| 99在线精品视频| 久久亚洲精选| 国产午夜亚洲精品羞羞网站| 在线一区二区三区做爰视频网站 | 午夜国产不卡在线观看视频| 亚洲国产欧美久久| 美国十次了思思久久精品导航| 国产精品亚洲不卡a| 在线视频日韩| 最新亚洲视频| 欧美插天视频在线播放| 中文精品视频| 欧美日本一区| 99视频精品免费观看| 欧美国产日韩一区二区| 久久久美女艺术照精彩视频福利播放| 久久国产精品99精品国产| 国产精品入口尤物| 香蕉av777xxx色综合一区| 一区二区三区四区五区在线| 欧美日韩国产综合新一区| 99re热精品| 亚洲精品字幕| 欧美日韩亚洲高清一区二区| 99精品热视频| 一本高清dvd不卡在线观看| 欧美四级电影网站| 亚洲宅男天堂在线观看无病毒| 日韩午夜在线视频| 国产精品美女久久| 欧美激情成人在线视频| 久久久999国产| 欧美性色综合| 小处雏高清一区二区三区| 在线亚洲电影| 国产视频一区免费看| 久久综合中文字幕| 美腿丝袜亚洲色图| 中文国产亚洲喷潮| 亚洲女ⅴideoshd黑人| 国产在线不卡视频| 女主播福利一区| 在线观看欧美日韩国产| 亚洲国产精品电影| 国产精品第一页第二页第三页| 国产在线精品一区二区中文 | 久久精品亚洲一区二区| 久久精品亚洲国产奇米99| 91久久精品www人人做人人爽| 亚洲日韩成人| 国产伦一区二区三区色一情| 美女啪啪无遮挡免费久久网站| 欧美成人免费全部| 午夜亚洲一区| 免费看亚洲片| 午夜精品久久久久久久99水蜜桃 | 欧美乱在线观看| 久久狠狠亚洲综合| 欧美精品一区在线播放| 久久精品在这里| 欧美人成免费网站| 久久全国免费视频| 欧美日韩精品免费观看视一区二区| 欧美一区二区女人| 欧美激情成人在线| 久久久久久综合| 国产精品久久久久毛片软件| 欧美高清不卡| 激情欧美一区| 亚洲欧美成人网| 一区二区三区欧美视频| 久久亚洲春色中文字幕久久久| 性欧美暴力猛交69hd| 欧美日韩国产综合在线| 亚洲第一在线综合网站| 一区免费在线| 欧美在线免费视频| 午夜精品久久久久影视 | 欧美大片免费观看在线观看网站推荐| 国产精品白丝av嫩草影院| 亚洲国产三级在线| 亚洲福利视频二区| 久久久久国产精品人| 性欧美1819sex性高清| 国产精品大片wwwwww| 日韩视频免费| 艳妇臀荡乳欲伦亚洲一区| 免费亚洲视频| 欧美日本在线视频| 亚洲一区二区三区午夜| 毛片一区二区| 亚洲欧美日韩网| 欧美三级免费| 欧美激情精品久久久久久黑人 | 欧美日韩在线亚洲一区蜜芽| 这里只有精品视频在线| 欧美激情一区二区三区蜜桃视频| 久久久精品国产免费观看同学| 欧美经典一区二区| 牛人盗摄一区二区三区视频| 国产午夜精品美女视频明星a级| 欧美亚洲在线播放| 午夜精品久久久久久久99水蜜桃| 欧美日韩精品久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲欧洲日韩女同| 欧美一区二区日韩| 亚洲综合激情| 国产免费成人av| 亚洲一区二区三区影院| 亚洲午夜在线观看| 欧美日韩视频在线一区二区| 欧美国产1区2区| 亚洲国产成人tv| 亚洲一卡二卡三卡四卡五卡| 国产精品久久国产愉拍| 亚洲一区不卡| 久久精品2019中文字幕| 久久久久久久尹人综合网亚洲| 欧美激情一区二区三区四区| 亚洲国产精品成人久久综合一区| 久久婷婷蜜乳一本欲蜜臀| 欧美成年网站| 精品动漫3d一区二区三区| 欧美大片在线看免费观看| 亚洲精品综合在线| 性欧美1819sex性高清| 国产性猛交xxxx免费看久久| 欧美ed2k| 99亚洲一区二区| 亚洲欧美一区二区三区久久| 国产欧美日韩在线视频| 久久精品电影| 99视频精品全国免费| 午夜精品福利电影| 国内揄拍国内精品久久| 你懂的网址国产 欧美| 美女国产一区| 欧美一区日本一区韩国一区| 激情自拍一区| 欧美精品二区| 欧美亚洲一区二区三区| 亚洲第一级黄色片| 欧美日韩一区三区四区| 性高湖久久久久久久久| 一区免费观看| 久久久天天操| 亚洲小说区图片区| 麻豆91精品| 亚洲深夜影院| 欧美日韩精品免费观看视一区二区|