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

為你寫詩

c/c++
隨筆 - 32, 文章 - 0, 評(píng)論 - 3, 引用 - 0
數(shù)據(jù)加載中……

樹狀數(shù)組的理解和應(yīng)用

樹狀數(shù)組

樹狀數(shù)組(Binary Indexed Tree)是又一種靜態(tài)的樹結(jié)構(gòu)。它的首要用途是用于維護(hù)前綴和,也即:一數(shù)組a[1..n],隨時(shí)會(huì)改變其中某a[i],還會(huì)詢問s[i]=a[1]+a[2]+…+a[i],樹狀數(shù)組可完美解決這一問題。

定義數(shù)組c[0..n],其中c[i]=a[i-2^k+1]+a[i-a^k+2]+…+a[i],其中k為i在二進(jìn)制下末尾0的個(gè)數(shù)。當(dāng)我們改變一個(gè)a[i]時(shí),會(huì)有很多c[i]隨之改變;若需查詢某個(gè)s[i],需要累加多個(gè)c[i]。好在確定需要改變或累加的元素都可以用比較簡(jiǎn)便的方法得出,這方法的核心就是lowbit值。

定義lowbit(x)=x&(x^(x-1)),它相當(dāng)于將最右邊的1左邊的東西全部去掉。若需改變a[i],則c[i]、c[i+lowbit(i)]、c[i+lowbit(i)+lowbit(i+lowbit(i)]……就是需要改變的c數(shù)組中的元素。若需查詢s[i],則c[i]、c[i-lowbit(i)]、c[i-lowbit(i)-lowbit(i-lowbit(i))]……就是需要累加的c數(shù)組中的元素。這看上去有些玄妙,我覺得其實(shí)也可以不用透徹理解。

一維的樹狀數(shù)組的每個(gè)操作的復(fù)雜度都是O(logn)的,非常高效。它可以擴(kuò)充為n維,這樣每個(gè)操作的復(fù)雜度就變成了O((logn)^n),在n不大的時(shí)候仍然完全可以接受。擴(kuò)充的方法就是將原來改變和查詢的函數(shù)中的一個(gè)循環(huán)改成嵌套的n個(gè)循環(huán)在n維的c數(shù)組中操作。

要注意樹狀樹組能處理的是下標(biāo)為1..n的數(shù)組,絕對(duì)不能出現(xiàn)下標(biāo)為0的情況。因?yàn)閘owbit(0)=0,這樣會(huì)陷入死循環(huán)。對(duì)于我這個(gè)從來都用C語言思考的家伙來說,這一點(diǎn)格外需要注意。

似乎樹狀數(shù)組也可以用來解決一些與前綴和關(guān)聯(lián)不大的問題,例如NOI2004的cashier,但我還不太會(huì)(那題我只會(huì)用平衡樹或線段樹或虛二叉樹解)。

示例程序:ural1470.cpp(三維的樹狀數(shù)組)

附:

 

【引言】

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

          但是不難發(fā)現(xiàn),如果我們修改了任意一個(gè)A[i],S[i]、S[i+1]...S[n]都會(huì)發(fā)生變化。

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

          當(dāng)n非常大時(shí),程序會(huì)運(yùn)行得非常緩慢。

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

【理論】

          為了對(duì)樹狀數(shù)組有個(gè)形 象的認(rèn)識(shí),我們先看下面這張圖。

       

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

          這里,C[i]表示A[i-2^k+1]到A[i]的和,而k則是i在二進(jìn)制時(shí)末尾0的個(gè)數(shù),

          或者說是i用2的冪方和表示時(shí)的最小指數(shù)。

         ( 當(dāng)然,利用位運(yùn)算,我們可以直接計(jì)算出2^k=i&(i^(i-1)) )

          同時(shí),我們也不難發(fā)現(xiàn),這個(gè)k就是該節(jié)點(diǎn)在樹中的高度,因而這個(gè)樹的高度不會(huì)超過logn。

          所以,當(dāng)我們修改A[i]的值時(shí),可以從C[i]往根節(jié)點(diǎn)一路上溯,調(diào)整這條路上的所有C[]即可,

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

          另外,對(duì)于求數(shù)列的前n項(xiàng)和,只需找到n以前的所有最大子樹,把其根節(jié)點(diǎn)的C加起來即可。

          不難發(fā)現(xiàn),這些子樹的數(shù)目是n在二進(jìn)制時(shí)1的個(gè)數(shù),或者說是把n展開成2的冪方和時(shí)的項(xiàng)數(shù),

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

          接著,我們考察這兩種操作下標(biāo)變化的規(guī)律:

          首先看修改操作:

          已知下標(biāo)i,求其父節(jié)點(diǎn)的下標(biāo)。
          我們可以考慮對(duì)樹從邏輯上轉(zhuǎn)化:

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

         有圖可知,對(duì)于節(jié)點(diǎn)i,其父節(jié)點(diǎn)的下標(biāo)與翻折出的空白節(jié)點(diǎn)下標(biāo)相同。

         因而父節(jié)點(diǎn)下標(biāo) p=i+2^k  (2^k是i用2的冪方和展開式中的最小冪,即i為根節(jié)點(diǎn)子樹的規(guī)模)

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

         接著對(duì)于求和操作:

         因?yàn)槊靠米訕涓采w的范圍都是2的冪,所以我們要求子樹i的前一棵樹,只需讓i減去2的最小冪即可。

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

        

         至此,我們已經(jīng)比較詳細(xì)的分析了樹狀數(shù)組的復(fù)雜度和原理。

         在最后,我們將給出一些樹狀數(shù)組的實(shí)現(xiàn)代碼,希望讀者能夠仔細(xì)體會(huì)其中的細(xì)節(jié)。

【代碼】

  求最小冪2^k:


int Lowbit(int t) 
{ 
    return t & ( t ^ ( t - 1 ) ); 
} 

             
  求前n項(xiàng)和:


int Sum(int end) 
{ 
    int sum = 0; 
    while(end > 0) 
    { 
        sum += in[end]; 
        end -= Lowbit(end); 
    } 
    return sum; 
} 

 對(duì)某個(gè)元素進(jìn)行加法操作: 

void plus(int pos , int num) 
{ 
    while(pos <= n) 
    { 
          in[pos] += num; 
          pos += Lowbit(pos); 
    } 
} 



posted on 2011-07-21 20:34 pp_zhang 閱讀(1563) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Ialgo

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品国产视频| 久久se精品一区二区| 开心色5月久久精品| 亚洲欧美国产制服动漫| 国产精品自在线| 麻豆精品视频| 欧美国产日韩一区| 亚洲一区二区三区777| 在线一区二区三区做爰视频网站| 国产精品高潮视频| 久久午夜色播影院免费高清| 久久综合久久综合久久综合| 亚洲精品国产精品国自产观看浪潮 | 在线亚洲观看| 国产午夜精品视频免费不卡69堂| 欧美专区福利在线| 老司机午夜精品视频| 99精品热视频| 欧美一区=区| 亚洲精品免费电影| 亚洲欧美视频一区| 亚洲人成在线影院| 亚洲一区观看| 亚洲人成77777在线观看网| 一本色道久久加勒比88综合| 国产在线视频欧美| 亚洲人成人99网站| 国产一区二区精品久久91| 亚洲成色777777在线观看影院 | 亚洲一区欧美一区| 91久久精品美女高潮| 亚洲一级特黄| 亚洲精品一区久久久久久| 亚洲欧美国产毛片在线| 亚洲国产影院| 欧美日韩一级黄| 蜜桃久久av一区| 国产精品高潮在线| 亚洲成色777777女色窝| 国产亚洲电影| 一区二区三区色| 亚洲精品国精品久久99热| 欧美影院在线| 欧美在线www| 欧美日韩亚洲免费| 欧美激情无毛| 一区二区亚洲精品国产| 亚洲永久字幕| 亚洲一区视频在线| 欧美巨乳在线观看| 欧美国产日本| 亚洲第一精品电影| 欧美一区二区久久久| 午夜精品视频在线观看一区二区| 欧美激情a∨在线视频播放| 欧美xx视频| 在线成人激情黄色| 欧美中在线观看| 久久亚洲免费| 激情一区二区| 久久久久欧美精品| 免费成人黄色av| 狠狠做深爱婷婷久久综合一区| 销魂美女一区二区三区视频在线| 欧美亚洲综合网| 国产欧美日韩一区二区三区在线观看| 在线一区二区三区四区| 亚洲午夜91| 国产精品爽爽ⅴa在线观看| 一区二区三区欧美亚洲| 午夜激情一区| 国产一区二区毛片| 久久成人资源| 欧美成人午夜激情| 亚洲免费播放| 国产精品久久久久久久久久久久久| 99国产精品久久久久久久成人热| 亚洲图中文字幕| 国产精品区一区二区三区| 亚洲女人av| 免费看黄裸体一级大秀欧美| 亚洲欧洲日本专区| 欧美视频精品一区| 午夜久久美女| 欧美第一黄色网| 亚洲天堂网在线观看| 国产三区精品| 免费观看日韩| 亚洲永久在线| 欧美成人自拍视频| 亚洲调教视频在线观看| 国产亚洲一区二区三区| 蜜桃av一区| 亚洲视屏在线播放| 欧美不卡视频一区| 亚洲深夜福利| 狠狠干成人综合网| 欧美区视频在线观看| 亚洲欧美日韩成人| 亚洲黄网站黄| 欧美中文字幕在线播放| 91久久中文字幕| 国产欧美短视频| 欧美freesex8一10精品| 午夜国产欧美理论在线播放| 在线看片一区| 久久一区免费| 亚洲午夜精品一区二区三区他趣| 久久综合精品一区| 亚洲欧美三级伦理| 99re6热在线精品视频播放速度| 国产精品主播| 欧美三级在线| 免费看亚洲片| 欧美中文日韩| 中文精品一区二区三区 | aa国产精品| 一区二区在线观看av| 国产精品免费网站| 欧美顶级艳妇交换群宴| 欧美影院成年免费版| 一区二区三区导航| 亚洲电影av| 久久久精品视频成人| 亚洲综合首页| 一区二区三区日韩欧美| 18成人免费观看视频| 国产亚洲欧美色| 国产乱码精品一区二区三| 欧美女人交a| 欧美福利视频一区| 老鸭窝毛片一区二区三区| 欧美在线|欧美| 欧美一区影院| 午夜精品亚洲一区二区三区嫩草| 一区二区三区欧美在线观看| 亚洲国产日韩欧美| 欧美国产日本韩| 欧美国产激情二区三区| 女同性一区二区三区人了人一 | 欧美一区二区三区在| 欧美一二区视频| 久久精品欧洲| 麻豆成人综合网| 欧美xx视频| 91久久精品国产91性色tv| 亚洲国产精品黑人久久久| 亚洲福利国产| 日韩午夜激情| 亚洲天堂第二页| 亚洲女性喷水在线观看一区| 性高湖久久久久久久久| 欧美亚洲免费在线| 久久久久久日产精品| 久久人人爽人人爽爽久久| 久久人91精品久久久久久不卡| 欧美a一区二区| 欧美日韩国产在线一区| 国产精品盗摄久久久| 国产三级欧美三级| 亚洲动漫精品| 一本在线高清不卡dvd | 一区二区久久久久| 午夜天堂精品久久久久| 久久精品一区四区| 亚洲高清免费视频| 日韩视频免费观看高清完整版| 亚洲一区二区在线播放| 久久精品国产久精国产一老狼| 久久亚洲欧美| 欧美日韩国产影片| 国产一区二区主播在线| 最新中文字幕一区二区三区| 亚洲调教视频在线观看| 久久全球大尺度高清视频| 亚洲黄网站黄| 香蕉成人久久| 欧美日韩国产限制| 国内精品视频久久| 一本色道久久综合亚洲精品高清 | 日韩视频免费看| 欧美一级夜夜爽| 欧美精品日韩一区| 国产日韩三区| 一本色道久久综合一区| 久久综合激情| 亚洲伊人伊色伊影伊综合网| 久久婷婷av| 国产亚洲第一区| 亚洲一区二区三区在线看| 免费在线观看一区二区| 亚洲小说区图片区| 欧美激情国产高清| 在线播放日韩| 欧美在线亚洲综合一区| 日韩视频三区| 欧美激情综合色综合啪啪| 狠狠色噜噜狠狠色综合久| 亚洲在线日韩| 亚洲精品日韩激情在线电影|