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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

從B樹談到R樹之B樹的c實現

http://blog.csdn.net/v_july_v/article/details/6735293(該博客值得深入翻閱)

 

 B樹談到R樹之B樹的c實現

作者:weedgeJuly。編程藝術室出品。

前言

    代碼大全的作者Steve McConnell曾稱,他所見識的任何一本書都不是某一個人能完全獨立即能完成的。吾深以為然。

    blog內的文章十有八九系我個人參考資料原創所作,同時十有二三系本人與吾的朋友共同創作完成。所以,諸君在瀏覽本博客內任何一篇文章時,務必尊重他人勞動成果。當然,有任何問題,歡迎隨時不吝指正。

    ok,在本blog之前的一篇文章中:B樹、B+樹、B*樹談到R ,各位讀者反應熱烈。這次,咱們來編碼實現B樹的查找,插入,刪除等操作。同時此文也算作是上一篇文章從B樹談到R樹的續。望諸君不吝賜教。謝謝。

第一部分、B樹的查找,插入,刪除等具體操作

    編碼實現B樹之前,咱們先來回顧一下上文中所給出的B樹的查找,插入,刪除等具體的操作都是怎么一回事兒。明白了原理之后,再來編程實現,就相對來說有方向感了。ok,請看下文(援引自B樹、B+樹、B*樹談到R 3小節):

B樹的插入、刪除操作

    上文第3小節簡單介紹了利用B樹這種結構如何訪問外存磁盤中的數據的情況,下面咱們通過另外一個實例來對這棵B樹的插入(insert,刪除(delete)基本操作進行詳細的介紹。

    但在此之前,咱們還得簡單回顧下一棵m階的B (m叉樹)的特性,如下:

  1. 樹中每個結點含有最多含有m個孩子,即m滿足:ceil(m/2)<=m<=m
  2. 除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是一個取上限的函數);
  3. 若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節點);
  4. 所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字信息(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指針都為null)
  5. 每個非終端結點中包含有n個關鍵字信息: (nP0K1P1K2P2......KnPn)。其中:
           a)   Ki (i=1...n)
    為關鍵字,且關鍵字按順序升序排序K(i-1)< Ki
           b)   Pi
    為指向子樹根的接點,且指針P(i-1)指向子樹種所有結點的關鍵字均小于Ki,但都大于K(i-1) 
           c)  
    除根結點之外的結點的關鍵字的個數n必須滿足: [ceil(m / 2)-1]<= n <= m-1(葉子結點也必須滿足此條關于關鍵字數的性質,根結點除外)。

    ok,下面咱們以一棵5階(m=5,即除根結點和葉子結點之外的內結點最多5個孩子,最少3個孩子)B樹實例進行講。

備注:

  • 關鍵字數(2-4個)針對--非根結點(包括葉子結點在內),孩子數(3-5個)--針對根結點和葉子結點之外的內結點。當然,根結點是必須至少有2個孩子的,不然就成直線型搜索樹了。
  • 我說的再明白點就是,一棵5階的B樹中任何一個結點的關鍵字數是1-4,孩子樹是2-5。同時,一棵5階的B樹的最大高度應為log_ceil(m/2)N(下劃線表示以ceil(m/2)為底)。

下圖中關鍵字為大寫字母,順序為字母升序。

結點定義如下:

typedef struct{
   int Count;         //
當前節點中關鍵元素數目
   ItemType Key[4];   //
存儲關鍵字元素的數組
   long Branch[5];    //
偽指針數組,(記錄數目)方便判斷合并和分裂的情況
} NodeType;

 

clip_image001

1.1、插入(insert)操作

    插入一個元素時,首先在B樹中是否存在,如果不存在,即在葉子結點處結束,然后在葉子結點中插入該新的元素,注意:

  • 如果葉子結點空間足夠,這里需要向右移動該葉子結點中大于新插入關鍵字的元素,
  • 如果空間滿了以致沒有足夠的空間去添加新的元素,則將該結點進行分裂,將一半數量的關鍵字元素分裂到新的其相鄰右結點中,中間關鍵字元素上移到父結點中(當然,如果父結點空間滿了,也同樣需要分裂操作),而且當結點中關鍵元素向右移動了,相關的指針也需要向右移。
  • 如果在根結點插入新元素,空間滿了,則進行分裂操作,這樣原來的根結點中的中間關鍵字元素向上移動到新的根結點中,因此導致樹的高度增加一層。

1、咱們通過一個實例來逐步講解下。插入以下字符字母到一棵空的B 樹中(非根結點關鍵字數小了(小于2個)就合并,大了(超過4個)就分裂):C N G A H E K Q M F W L T Z D P R X Y S,首先,結點空間足夠,4個字母插入相同的結點中,如下圖:

 clip_image002

2、當咱們試著插入H時,結點發現空間不夠,以致將其分裂成2個結點,移動中間元素G上移到新的根結點中,在實現過程中,咱們把AC留在當前結點中,而HN放置新的其右鄰居結點中。如下圖:

 clip_image003

3、當咱們插入E,K,Q時,不需要任何分裂操作

clip_image004

4、插入M需要一次分裂,注意M恰好是中間關鍵字元素,以致向上移到父節點中

 

clip_image005

5、插入F,W,L,T不需要任何分裂操作

 

clip_image006

6、插入Z時,最右的葉子結點空間滿了,需要進行分裂操作,中間元素T上移到父節點中,注意通過上移中間元素,樹最終還是保持平衡,分裂結果的結點存在2個關鍵字元素。

 

clip_image007

7、插入D時,導致最左邊的葉子結點被分裂,D恰好也是中間元素,上移到父節點中,然后字母P,R,X,Y陸續插入不需要任何分裂操作(別忘了,樹中至多5個孩子)。

 

clip_image008

8、最后,當插入S時,含有N,P,Q,R的結點需要分裂,把中間元素Q上移到父節點中,但是情況來了,父節點中空間已經滿了,所以也要進行分裂,將父節點中的中間元素M上移到新形成的根結點中,注意以前在父節點中的第三個指針在修改后包括DG節點中。這樣具體插入操作的完成,下面介紹刪除操作,刪除操作相對于插入操作要考慮的情況多點。

 

clip_image009

1.2、刪除(delete)操作

    首先查找B樹中需刪除的元素,如果該元素在B樹中存在,則將該元素在其結點中進行刪除,如果刪除該元素后,首先判斷該元素是否有左右孩子結點,如果有,則上移孩子結點中的某相近元素到父節點中,然后是移動之后的情況;如果沒有,直接刪除后,移動之后的情況。

    刪除元素,移動相應元素之后,

  • 如果某結點中元素數目(即關鍵字數)小于ceil(m/2)-1,則需要看其某相鄰兄弟結點是否豐滿(結點中元素個數大于ceil(m/2)-1)(還記得第一節中關于B樹的第5個特性中的c點么? c)除根結點之外的結點(包括葉子結點)的關鍵字的個數n必須滿足: ceil(m / 2)-1<= n <= m-1m表示最多含有m個孩子,n表示關鍵字數。在本小節中舉的一顆B樹的示例中,關鍵字數n滿足:2<=n<=4),
  • 如果豐滿,則向父節點借一個元素來滿足條件;
  • 如果其相鄰兄弟都剛脫貧,即借了之后其結點數目小于ceil(m/2)-1,則該結點與其相鄰的某一兄弟結點進行合并成一個結點,以此來滿足條件。

    那咱們通過下面實例來詳細了解吧。

    以上述插入操作構造的一棵5B樹(樹中最多含有mm=5)個孩子,因此關鍵字數最小為ceil(m / 2)-1=2還是這句話,關鍵字數小了(小于2個)就合并,大了(超過4個)就分裂)為例,依次刪除H,T,R,E

clip_image009

1、首先刪除元素H,當然首先查找HH在一個葉子結點中,且該葉子結點元素數目3大于最小元素數目ceil(m/2)-1=2,則操作很簡單,咱們只需要移動K至原來H的位置,移動LK的位置(也就是結點中刪除元素后面的元素向前移動)

 

clip_image010

2、下一步,刪除T,因為T沒有在葉子結點中,而是在中間結點中找到,咱們發現他的繼承者W(字母升序的下個元素),將W上移到T的位置,然后將原包含W的孩子結點中的W進行刪除,這里恰好刪除W后,該孩子結點中元素個數大于2,無需進行合并操作。

 

clip_image011

3、下一步刪除RR在葉子結點中,但是該結點中元素數目為2,刪除導致只有1個元素,已經小于最小元素數目ceil(5/2)-1=2,而由前面我們已經知道:如果其某個相鄰兄弟結點中比較豐滿(元素個數大于ceil(5/2)-1=2),則可以向父結點借一個元素,然后將最豐滿的相鄰兄弟結點中上移最后或最前一個元素到父節點中(有沒有看到紅黑樹中左旋操作的影子?),在這個實例中,右相鄰兄弟結點中比較豐滿(3個元素大于2),所以先向父節點借一個元素W下移到該葉子結點中,代替原來S的位置,S前移;然后X在相鄰右兄弟結點中上移到父結點中,最后在相鄰右兄弟結點中刪除X,后面元素前移。

 

clip_image012

4、最后一步刪除E 刪除后會導致很多問題,因為E所在的結點數目剛好達標,剛好滿足最小元素個數(ceil(5/2)-1=2,而相鄰的兄弟結點也是同樣的情況,刪除一個元素都不能滿足條件,所以需要該節點與某相鄰兄弟結點進行合并操作;首先移動父結點中的元素(該元素在兩個需要合并的兩個結點元素之間)下移到其子結點中,然后將這兩個結點進行合并成一個結點。所以在該實例中,咱們首先將父節點中的元素D下移到已經刪除E而只有F的結點中,然后將含有DF的結點和含有A,C的相鄰兄弟結點進行合并成一個結點。

 

clip_image013

5、也許你認為這樣刪除操作已經結束了,其實不然,在看看上圖,對于這種特殊情況,你立即會發現父節點只包含一個元素G,沒達標(因為非根節點包括葉子結點的關鍵字數n必須滿足于2=<n<=4,而此處的n=1),這是不能夠接受的。如果這個問題結點的相鄰兄弟比較豐滿,則可以向父結點借一個元素。假設這時右兄弟結點(含有Q,X)有一個以上的元素(Q右邊還有元素),然后咱們將M下移到元素很少的子結點中,將Q上移到M的位置,這時,Q的左子樹將變成M的右子樹,也就是含有NP結點被依附在M的右指針上。所以在這個實例中,咱們沒有辦法去借一個元素,只能與兄弟結點進行合并成一個結點,而根結點中的唯一元素M下移到子結點,這樣,樹的高度減少一層。

 

clip_image014

為了進一步詳細討論刪除的情況,再舉另外一個實例

這里是一棵不同的5B樹,那咱們試著刪除C

 

clip_image015

于是將刪除元素C的右子結點中的D元素上移到C的位置,但是出現上移元素后,只有一個元素的結點的情況。

又因為含有E的結點,其相鄰兄弟結點才剛脫貧(最少元素個數為2),不可能向父節點借元素,所以只能進行合并操作,于是這里將含有A,B的左兄弟結點和含有E的結點進行合并成一個結點。

 

clip_image016

這樣又出現只含有一個元素F結點的情況,這時,其相鄰的兄弟結點是豐滿的(元素個數為3>最小元素個數2),這樣就可以想父結點借元素了,把父結點中的J下移到該結點中,相應的如果結點中J后有元素則前移,然后相鄰兄弟結點中的第一個元素(或者最后一個元素)上移到父節點中,后面的元素(或者前面的元素)前移(或者后移);注意含有KL的結點以前依附在M的左邊,現在變為依附在J的右邊。這樣每個結點都滿足B樹結構性質。

 

clip_image017

從以上操作可看出:除根結點之外的結點(包括葉子結點)的關鍵字的個數n滿足:(ceil(m / 2)-1<= n <= m-1,即2<=n<=4。這也佐證了咱們之前的觀點。刪除操作完。

第二部分、B樹的編碼實現

    既然明白了B樹的插入,和刪除操作的原理,接下來,咱們來一步一步實現它。不過,有一點必須說明的是:這個實現只是實現了偶數序order(階)的情況;還有奇數序order(階)的情況沒有考慮。待日后改進。

  • ok,以下是頭文件:

  • 下面是B樹的實現文件:

  • 最后,給出測試文件:

參考

  • http://m.shnenglu.com/converse/archive/2009/10/13/98521.html

聯系作者:

    若有任何問題,歡迎隨時不吝指正。或者聯系我們:

后記:

    blog日后會更多的關注數據結構與算法之外的東西,如分布式架構,海量數據處理,搜索引擎相關。畢竟,算法之外的東西,如瀚海般無止境,要學的東西,還有很多。

    若轉載,請注明出處,謝謝。完。二零一一年八月三十一日。

 

posted on 2011-09-01 11:02 肥仔 閱讀(2252) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎數據庫

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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电影| 亚洲精品偷拍| 夜夜嗨网站十八久久| 亚洲午夜性刺激影院| 午夜亚洲伦理| 久久亚洲精品视频| 欧美精品亚洲一区二区在线播放| 嫩草国产精品入口| 欧美日韩一区二区三区高清| 国产精品一区二区三区观看| 欲香欲色天天天综合和网| 亚洲久久成人| 欧美一区二区成人| 蜜桃久久av一区| 9l国产精品久久久久麻豆| 午夜精品国产更新| 欧美成人精品1314www| 欧美视频免费在线| 激情成人在线视频| 亚洲午夜伦理| 免费不卡亚洲欧美| 在线一区亚洲| 免费在线观看一区二区| 国产精品网曝门| 亚洲国产天堂久久综合| 欧美亚洲一级片| 亚洲国产精品一区二区久| 91久久精品美女高潮| 午夜在线电影亚洲一区| 欧美日韩国产综合视频在线观看中文| 国产亚洲欧美另类中文| 一区二区三区 在线观看视| 久久精品夜色噜噜亚洲a∨| 亚洲精品乱码久久久久久| 久久久久久久999精品视频| 国产精品视频一二三| 亚洲伦理在线| 欧美成人dvd在线视频| 亚洲欧美国产高清va在线播| 欧美日本乱大交xxxxx| 亚洲高清成人| 久久久久久国产精品mv| 亚洲图色在线| 欧美日韩小视频| 日韩视频国产视频| 欧美成人日韩| 久久九九免费视频| 国产一区二区看久久| 香蕉免费一区二区三区在线观看| 亚洲精品国产精品乱码不99| 免费成人黄色片| 亚洲高清激情| 亚洲第一黄网| 久久久久久久久蜜桃| 欧美日韩精品免费观看视一区二区| 欧美激情一区| 最新日韩在线视频| 欧美高清在线一区| 免费观看日韩| 亚洲精品一线二线三线无人区| 欧美国产激情二区三区| 欧美 日韩 国产一区二区在线视频| 极品少妇一区二区三区精品视频| 久久久久久久久综合| 久久精品免费观看| 亚洲国产成人精品视频| 男女视频一区二区| 欧美高清视频一二三区| aaa亚洲精品一二三区| 日韩网站在线| 国产精品视频一区二区三区 | 老司机一区二区| 老巨人导航500精品| 亚洲日本无吗高清不卡| 亚洲麻豆av| 国产日韩欧美在线| 免费美女久久99| 欧美人牲a欧美精品| 午夜精品久久久久久久男人的天堂| 亚洲网站在线播放| 国产一区二区精品丝袜| 亚洲国产精品尤物yw在线观看| 欧美日韩三级| 久久久久国内| 欧美日本韩国| 久久久国产一区二区| 欧美国产另类| 性一交一乱一区二区洋洋av| 久久成人羞羞网站| 亚洲老司机av| 午夜一区二区三区在线观看| 亚洲人成在线观看网站高清| 一区二区三区视频在线看| 国模套图日韩精品一区二区| 亚洲日本免费电影| 国产视频一区在线| 亚洲人久久久| 国产精品福利久久久| 免费不卡在线观看av| 国产精品久久久久久久久久久久久久| 久久久亚洲成人| 欧美日韩一区二区三区免费| 另类酷文…触手系列精品集v1小说| 欧美精品免费观看二区| 久久久久国产精品麻豆ai换脸| 欧美日韩黄色大片| 欧美刺激性大交免费视频| 国产精品欧美一区喷水 | 亚洲精品女人| 国产精品男人爽免费视频1| 欧美高清一区| 国产主播一区二区三区| 中文精品99久久国产香蕉| 亚洲精品国产精品国产自| 中文国产成人精品久久一| 久久久国产精品一区二区中文| 欧美日韩国产123| 久热精品视频在线观看一区| 国产精品美女诱惑| 亚洲美女黄色| 99精品视频免费观看视频| 可以免费看不卡的av网站| 久久久久久自在自线| 国产精品日韩一区二区三区| 亚洲免费av电影| 欧美日韩精品一二三区| 亚洲欧洲在线播放| 亚洲大片一区二区三区| 黄色欧美成人| 久久精品一区二区三区不卡牛牛| 羞羞漫画18久久大片| 国产免费亚洲高清| 午夜国产精品影院在线观看| 亚洲欧美福利一区二区| 欧美午夜精品电影| 夜夜狂射影院欧美极品| 亚洲一区二区三区影院| 欧美午夜不卡在线观看免费| 一本久道久久综合狠狠爱| 一区二区欧美激情| 国产精品福利影院| 亚洲欧美国产精品专区久久| 欧美专区一区二区三区| 国产偷国产偷亚洲高清97cao| 午夜一区二区三区在线观看| 久久综合99re88久久爱| 亚洲第一伊人| 欧美另类69精品久久久久9999| 亚洲国产婷婷香蕉久久久久久| 亚洲黄网站在线观看| 欧美日韩国产成人精品| 亚洲视频第一页| 久久精品成人| 在线国产精品一区| 欧美精品久久久久久久久老牛影院| 亚洲日本理论电影| 欧美亚洲视频在线看网址| 国产一区二区主播在线| 久色成人在线| 亚洲午夜久久久久久久久电影院 | 一二三区精品| 亚洲大胆视频| 亚洲免费视频网站| 激情欧美国产欧美| 欧美精品久久久久久久免费观看| 亚洲网站视频福利| 欧美va日韩va| 亚洲欧洲av一区二区| 国语精品中文字幕| 欧美日韩在线播放三区四区| 午夜电影亚洲| 亚洲高清在线| 欧美一区二区三区四区夜夜大片| 精品成人久久| 欧美色中文字幕| 久久久亚洲成人| 亚洲特级片在线| 欧美freesex8一10精品| 亚洲欧美久久久| 亚洲精品在线视频观看| 亚洲欧美日韩精品久久奇米色影视| 亚洲在线视频免费观看| 欧美大胆成人| 亚洲午夜精品一区二区| 亚洲第一网站免费视频| 国产精品豆花视频| 欧美黄色成人网| 午夜国产精品视频| 亚洲激精日韩激精欧美精品| 久久天堂av综合合色| 中文av一区特黄| 亚洲国产婷婷香蕉久久久久久99| 国产精品欧美风情| 欧美精品国产精品| 久久青青草综合| aaa亚洲精品一二三区| 欧美国产日韩a欧美在线观看|