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

為你寫詩

c/c++
隨筆 - 32, 文章 - 0, 評論 - 3, 引用 - 0
數據加載中……

樹狀數組的理解和應用

樹狀數組

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

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

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

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

要注意樹狀樹組能處理的是下標為1..n的數組,絕對不能出現下標為0的情況。因為lowbit(0)=0,這樣會陷入死循環。對于我這個從來都用C語言思考的家伙來說,這一點格外需要注意。

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

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

附:

 

【引言】

          在解題過程中,我們有時需要維護一個數組的前綴和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 t) 
{ 
    return t & ( t ^ ( t - 1 ) ); 
} 

             
  求前n項和:


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

 對某個元素進行加法操作: 

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) 評論(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>
            亚洲人成网站777色婷婷| 国产精品区二区三区日本| 免费成人性网站| 久久久精品999| 久久久久久欧美| 另类综合日韩欧美亚洲| 久热成人在线视频| 亚洲国产一区二区视频| 亚洲人成网站色ww在线| 一区二区成人精品| 欧美中文字幕视频在线观看| 久久久久久久久久码影片| 蜜桃精品久久久久久久免费影院| 老司机免费视频一区二区| 欧美日韩综合网| 国产亚洲一区二区在线观看| 在线日韩欧美视频| 亚洲欧美日韩区 | 久久精品中文字幕免费mv| 久久久久久久网| 日韩视频在线观看| 欧美伊久线香蕉线新在线| 欧美精品久久久久久久免费观看| 国产精品外国| 亚洲免费av电影| 欧美在线播放一区| 亚洲欧洲一二三| 香蕉久久夜色精品国产| 欧美黑人国产人伦爽爽爽| 国产麻豆综合| 国产精品99久久99久久久二8| 久久国产精品99国产精| 日韩视频一区二区三区在线播放免费观看 | 国产欧美综合在线| 亚洲精品之草原avav久久| 欧美亚洲一区二区在线| 欧美高清你懂得| 欧美制服丝袜| 国产精品一区二区三区久久| 一本久久a久久免费精品不卡| 久久中文字幕一区| 亚洲自拍偷拍福利| 欧美日韩亚洲一区二区三区四区| 国产一区二区三区在线观看视频| 亚洲一区二区三区高清| 亚洲黄色一区| 欧美www在线| 亚洲高清网站| 国产一区二区黄| 亚洲综合视频一区| 亚洲精品自在久久| 欧美精品电影在线| 亚洲日韩视频| 亚洲国内高清视频| 欧美承认网站| 亚洲精品麻豆| 欧美激情免费观看| 久久综合久色欧美综合狠狠| 狠狠色综合播放一区二区| 久久久久久久久蜜桃| 久久精品国产99国产精品| 国产一区二区精品久久| 久久精品青青大伊人av| 午夜欧美理论片| 国一区二区在线观看| 老司机aⅴ在线精品导航| 久久久综合免费视频| 亚洲国产综合91精品麻豆| 亚洲国产精品激情在线观看| 欧美激情aⅴ一区二区三区| 99国内精品久久久久久久软件| 亚洲人成网站在线观看播放| 欧美午夜精品久久久久久人妖| 亚洲一区二区在线| 亚洲综合色在线| 亚洲高清在线精品| 亚洲三级免费| 国产精品丝袜91| 美女久久一区| 欧美日韩在线播放| 久久国产精品色婷婷| 久久全球大尺度高清视频| 亚洲精品麻豆| 性欧美暴力猛交69hd| 亚洲第一中文字幕| 日韩一二三区视频| 国产最新精品精品你懂的| 欧美.日韩.国产.一区.二区| 欧美日韩一区二区三区四区五区| 欧美亚洲综合网| 久久精品国产一区二区三| 日韩视频精品在线| 欧美一区二区三区成人| 日韩午夜激情电影| 欧美尤物巨大精品爽| 亚洲人成小说网站色在线| 亚洲图片欧洲图片日韩av| 在线播放国产一区中文字幕剧情欧美| 亚洲电影专区| 国产一区二区三区精品久久久| 亚洲国产精品美女| 国产亚洲成av人片在线观看桃| 亚洲丶国产丶欧美一区二区三区| 国产精品一香蕉国产线看观看 | 久久精品人人做人人爽电影蜜月| 亚洲理伦在线| 久久精品国产亚洲一区二区| 亚洲一区二区在线免费观看视频| 亚洲精品日韩在线观看| 国产欧美精品日韩区二区麻豆天美| 玖玖国产精品视频| 国产精品日本一区二区 | 欧美在线综合视频| 亚洲午夜精品一区二区| 久久字幕精品一区| 久久久亚洲高清| 国产日韩欧美综合一区| 日韩视频在线播放| 日韩午夜高潮| 欧美sm极限捆绑bd| 免播放器亚洲一区| 国内精品美女在线观看| 亚洲尤物在线视频观看| 亚洲网站视频| 欧美日韩1区2区| 亚洲欧洲精品一区二区| 亚洲国产精品成人综合| 久久精品综合网| 久久国产精品亚洲77777| 国产精品私房写真福利视频| 一区二区日韩精品| 亚洲影院色无极综合| 欧美日韩视频在线一区二区| 亚洲精品自在久久| 亚洲一区二区三区中文字幕在线| 欧美日韩精品在线播放| 亚洲人成亚洲人成在线观看图片| 亚洲欧洲精品一区二区三区| 免费亚洲一区| 91久久国产综合久久蜜月精品| 亚洲激情婷婷| 欧美日本不卡高清| 亚洲乱码国产乱码精品精可以看 | 欧美精品日日鲁夜夜添| 亚洲大片av| 99精品国产在热久久| 欧美日韩一区二区三区四区五区 | 久久男人资源视频| 一区二区三区中文在线观看 | 一二三区精品| 国产精品v欧美精品v日韩精品| 一区二区三欧美| 欧美一区二区观看视频| 国内外成人在线视频| 欧美mv日韩mv国产网站| 亚洲每日更新| 性色av一区二区三区| 激情欧美一区二区三区| 男人的天堂亚洲| 日韩午夜在线播放| 久久精品免费| 亚洲人成艺术| 国产精品毛片| 久久深夜福利免费观看| 亚洲精一区二区三区| 欧美亚洲综合网| 亚洲激情电影中文字幕| 国产精品久久久久久久久久妞妞 | 亚洲黄色视屏| 老司机亚洲精品| 亚洲国产综合在线看不卡| 欧美激情一区二区三区在线视频 | 国产精品爽黄69| 久久伊人精品天天| 亚洲影院在线| 亚洲电影免费| 久久精品国产一区二区电影| 91久久精品一区| 国产女人aaa级久久久级| 欧美激情1区| 久久久久久电影| 一本色道久久综合亚洲精品不| 久久亚洲精品一区二区| 亚洲尤物在线视频观看| 最近看过的日韩成人| 国产欧美日韩视频| 欧美日韩国产片| 美日韩在线观看| 欧美一区二区精品在线| 一区二区三区免费看| 欧美va亚洲va日韩∨a综合色| 欧美一区视频| 亚洲欧美日韩第一区| 一本色道久久综合亚洲精品高清| 黄色精品网站| 国内精品福利| 国产亚洲视频在线| 国产精品天天看| 国产精品久久久久9999| 欧美三级黄美女|