• <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>

            雁過無痕

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::

            樹狀數(shù)組(Fenwick tree,又名binary indexed tree),是一種很實(shí)用的數(shù)據(jù)結(jié)構(gòu)。它通過用節(jié)點(diǎn)i,記錄數(shù)組下標(biāo)在[ i –2^k + 1, i]這段區(qū)間的所有數(shù)的信息(其中,ki的二進(jìn)制表示中末尾0的個(gè)數(shù),設(shè)lowbit(i) = 2^k),實(shí)現(xiàn)在O(lg n) 時(shí)間內(nèi)對(duì)數(shù)組數(shù)據(jù)的查找和更新。

            樹狀數(shù)組的傳統(tǒng)解釋圖,不能很直觀的看出其所能進(jìn)行的更新和查詢操作。其最主要的操作函數(shù)lowbit(k)與數(shù)的二進(jìn)制表示相關(guān),本質(zhì)上仍是一種二分。因而可以通過二叉樹,對(duì)其進(jìn)行分析。事實(shí)上,從二叉樹圖,我們對(duì)它所能進(jìn)行的操作和不能進(jìn)行的操作一目了然。

            和前面提到的點(diǎn)樹類似,先畫一棵二叉樹,然后對(duì)節(jié)點(diǎn)中序遍歷(點(diǎn)樹是采用廣度優(yōu)先),每個(gè)節(jié)點(diǎn)仍然只記錄左子樹信息,見圖:

             

             

            由于采用的是中序遍歷,從節(jié)點(diǎn)1到節(jié)點(diǎn)k時(shí),剛好有k個(gè)葉子被統(tǒng)計(jì)。

            可以證明:

              葉子k,一定在節(jié)點(diǎn)k子樹下。

              以節(jié)點(diǎn)k為根的樹,其子樹共有葉子lowbit(k)

            節(jié)點(diǎn)k的父節(jié)點(diǎn)是:k + lowbit(k) k - lowbit(k) 

            節(jié)點(diǎn)k + lowbit(k) 是節(jié)點(diǎn)k的最近父節(jié)點(diǎn),且節(jié)點(diǎn)k在它的子樹下。

            節(jié)點(diǎn)k - lowbit(k) 是節(jié)點(diǎn)k的最近父節(jié)點(diǎn),且節(jié)點(diǎn)k在它的子樹下。

            節(jié)點(diǎn)k,統(tǒng)計(jì)的葉子范圍為:(k - lowbit(k),  k]

            節(jié)點(diǎn)k的左孩子是:k - lowbit(k) / 2

             

            下面分析樹狀數(shù)組兩面主要應(yīng)用:

            1 更新數(shù)據(jù)x,進(jìn)行區(qū)間查詢。

            2 更新區(qū)間,查詢某個(gè)數(shù)。

            由于,樹狀數(shù)組只統(tǒng)計(jì)了左子樹的信息,因而只能查詢更新區(qū)間[1, x]。只在在滿足[x,y]的信息可以由[1,x-1][1,y]的信息推導(dǎo)出時(shí),才能進(jìn)行區(qū)間[x,y]的查詢更新。這也是樹狀數(shù)組不能用于任意區(qū)間求最值的根本原因。

             

            先定義兩個(gè)集合:

            up_right(k) 節(jié)點(diǎn)k所有的父節(jié)點(diǎn),且節(jié)點(diǎn)k在它們的子樹下。

            up_left(k)   節(jié)點(diǎn)k所有的父節(jié)點(diǎn),且節(jié)點(diǎn)k在它們的子樹下。

             

            1  更新數(shù)據(jù)x,查詢區(qū)間[1,y]

            顯然,更新葉子x,要找出葉子x在哪些節(jié)點(diǎn)的子樹下。因而節(jié)點(diǎn)k、所有的up_right(k)

            都要更新。

            查詢[1, y],實(shí)際上就是把該區(qū)間拆分成一系列小區(qū)間,并找出統(tǒng)計(jì)這些區(qū)間的節(jié)點(diǎn)。可以通過找出y在哪些節(jié)點(diǎn)的子樹下,這些節(jié)點(diǎn)恰好不重復(fù)的統(tǒng)計(jì)了區(qū)間[1, y-1]。因而要訪問節(jié)點(diǎn)y、所有的up_left(y)

             

            2 更新區(qū)間[1,y],查詢數(shù)據(jù)x

              這和前面的操作恰好相反。與前面的最大不同之處在于:節(jié)點(diǎn)保存的不再是其葉子總個(gè)數(shù)這些信息,而是該區(qū)間的所有葉子都改變了多少。也就是說:每個(gè)葉子的信息,分散到了所有對(duì)它統(tǒng)計(jì)的節(jié)點(diǎn)上。因此操作和前面相似:

              更新[1,y]時(shí),更新節(jié)點(diǎn)y、所有up_left(y)

              查詢x時(shí),  訪問x、所有up_right(x)

             

            前面的樹狀數(shù)組,只對(duì)左子樹信息進(jìn)行統(tǒng)計(jì),如果從后往前讀數(shù)據(jù)初始化樹狀數(shù)組,則變成只對(duì)右子樹信息進(jìn)行統(tǒng)計(jì),這時(shí)更新和查詢操作,剛好和前面的相反。

             

            一般情況下,樹狀數(shù)組比點(diǎn)樹省空間,對(duì)區(qū)間[1, M]只要M+1空間,查詢更新時(shí)定位節(jié)點(diǎn)比較快,定位父節(jié)點(diǎn)和左右孩子相對(duì)麻煩點(diǎn)(不過,一般也不用到。從上往下查找,可參考下面代碼中的erease_nth函數(shù)(刪除第n小的數(shù)))。

             

            下面是使用樹狀數(shù)組的實(shí)現(xiàn)代碼(求逆序數(shù)和模擬約瑟夫環(huán)問題):


            樹狀數(shù)組





            作者: flyinghearts
            出處: http://www.cnblogs.com/flyinghearts/
            本文采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 2.5 中國(guó)大陸許可協(xié)議進(jìn)行許可,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


            posted on 2011-04-11 23:54 flyinghearts 閱讀(1930) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 算法
            国产激情久久久久影院| 亚洲精品乱码久久久久久蜜桃图片 | 久久97精品久久久久久久不卡| 久久99国产精品尤物| 久久免费小视频| 综合久久一区二区三区 | 中文字幕精品久久久久人妻| 囯产精品久久久久久久久蜜桃| 久久综合狠狠综合久久综合88| 久久香蕉一级毛片| 亚洲国产另类久久久精品小说| 国产成人综合久久综合| 日本五月天婷久久网站| 91秦先生久久久久久久| 日日狠狠久久偷偷色综合0| 狠狠狠色丁香婷婷综合久久五月| 久久综合伊人77777| 精品久久香蕉国产线看观看亚洲| 91麻豆国产精品91久久久| 国产综合精品久久亚洲| 97久久超碰国产精品旧版| 免费久久人人爽人人爽av| 久久97久久97精品免视看秋霞| 久久婷婷五月综合色高清| 性做久久久久久久久久久| 青青草原1769久久免费播放| 波多野结衣AV无码久久一区| 香蕉99久久国产综合精品宅男自 | 亚洲午夜无码久久久久小说| 久久精品国产99国产电影网| 亚洲国产另类久久久精品黑人| 一级a性色生活片久久无少妇一级婬片免费放 | 国产精品欧美亚洲韩国日本久久| 国产精品久久久久久久| 久久亚洲精品无码AV红樱桃| 一本久久a久久精品vr综合| 漂亮人妻被中出中文字幕久久 | 国内精品久久九九国产精品| 国产亚洲欧美精品久久久| 精品久久久久香蕉网| 99久久er这里只有精品18|