日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件储存树的理解(ISAM 和 B+Tree)

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件储存树的理解(ISAM 和 B+Tree) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

兩種文件儲存樹的理解(ISAM 和 B+Tree)

1. 文件簡要概括

如何儲存文件?如何快速的查找到所需文件?我們需要引入索引(index)這個概念。想象在圖書館中的分類,每一本書都有一個所屬區域、類別、獨一無二的id。根據這些索引信息,我們就能在書海中快速查找到特定的書籍。那對計算機文件而言,我們需要有索引文件(index file)、儲存的信息(record)。

1.1 Index file是什么

Index file用來儲存多個index entries。
Index entries, 需要儲存兩個信息:查找鍵(search key)、指針(pointer)。
查找鍵是由一個或多個屬性組成,用于對數據進行查找的索引。例如:學生的id、用戶年齡等等。
指針存放的是對應index entries或者record的地址。

2. Indexed Sequential Access Method(ISAM)

2.1 ISAM的結構

要想結構化儲存大量文件,我們需要Index file 和 Data File。為每一個record分配一個Index Entry,并對search key(K0, K1, K2等)進行排序,這樣我們也可以對Index File進行二分查找(Binary Search)。
具體結構圖如下:

2.2 ISAM的樹狀結構

但是上述儲存結構還是不夠高效, 因為Index File依舊可能會很大。所以我們引入樹狀結構。
根據Search Key進行分類。從上至下為根節點、子(樹)節點、葉節點。
結構圖如下:

2.2.1 查找操作

等式查找

舉個栗子,假設我們想在下圖中查找Search Key為27所保存的record, 每一個節點只能保存兩個Search Key。首先我們在根節點(Root)判斷27<40, 故選擇左節點。接著在第二層進行判斷, 22 < 27 < 33,選擇中間節點指向葉節點,在其中查找到27。
具體圖示如下:(每一個框中的數字均為Search Key,*為葉節點)

范圍查找

繼續舉個例子,假設我們要查找40<= x <63,首先,從根節點判斷大于40,選擇右邊節點,繼續判斷40 < 51,選擇51左邊的pointer指向的文件,從對應的葉子節點頁中查找出相應大于40的Search Key(40*)。重復上述操作,直到查找到小于63*的數據。

2.2.2 插入操作

假設每一個Page只能保存兩個Search Key。當Page中沒有空余位置時,ISAM會鏈接一個額外的page來存儲這個search key,即overflow page。如下圖所示,假設插入23*、48*、41*、42*。

假設這棵樹有很多的Overflow Page,這樣會導致產生很長的鏈表,并且存儲的Search Key是隨機的,查找很不方便,效率降低。

2.2.3 刪除操作

ISAM的刪除操作很簡單,只刪除葉節點中的Search Key如果刪除相對應的文件后,此Page中的Search Key為空,則刪除此Page。
例如:刪除上圖中的51*,只會刪除在Primary Leaf Pages中的51*,還會保留Index Page中的51.

3. B+ Tree

2.1 什么是B+ Tree

B+ Tree是一種具有動態深度的樹狀結構。由于前文中,ISAM結構可能會產生大量的Overflow Pages,對文件的查找操作造成極大的影響,并且只能對葉子節點進行修改,所以引入了B+ Tree這一結構來對其進行改進。

一般為了提高搜索效率,樹的高度要盡可能地低,一般為3-4層,而且是高度集成的,即每一個葉子節點中盡可能多的存儲值。此外,在葉結點中,每個page之間互相連接,這樣便于范圍查找。如下圖所示:

另外,需要規定B+ Tree中每一個節點中的最小占有率,此文一律使用最小為50%。即上圖中每個節點儲存數目不允許小于2.

2.2 樹的操作邏輯

2.2.1 查找數據

查找方式同ISAM相同。具體可以查看ISAM的查找數據方式。

2.2.2 插入數據

2.2.2.1 不允許重新分配

在B+ Tree中插入新的數據要滿足一下流程:

  • 查找到正確的葉節點L。
  • 準備插入數據到葉節點L:
    如果L中依然有空余位置插入,則將值插入即可。
    若無空余位置,則將該葉節點L分裂成為兩個節點新的L和L2,并將L和新數據均勻地分配給兩個新節點,并將其中的中間值復制Copy Up到上一層節點中。再將L和L2鏈接起來。
  • 假如插入值過后,樹節點超過了每一個頁允許儲存的最大entry數,則:
    將樹節點分裂成為兩個新的節點,將數據均勻的分配,并將中間值推到Push Up更上一層的節點。
    注意:此處區別Copy Up and Push Up。樹節點分裂后要push,葉子節點分類后用copy。
    下圖演示插入8*的過程:



  • 2.2.2.2 允許重新分配

    在插入一個數據后,葉節點出現overflow page,此時檢查該葉節點同父節點下的相鄰節點是否存在空余空間,若存在,則將該值插入相鄰兄弟節點,并將上一級樹節點重新分配;反之執行分裂、插入操作。
    下圖給出示例:

    2.2.3 刪除數據

  • 查找到想刪除數據的對應葉節點。
  • 刪除該數據后
  • 如果占有率大于等于50%,操作完成;
  • 如果占有率小于50%時:
  • 嘗試從該葉子節點同父節點的兄弟葉子節點中獲取值進行重新分配,假設兄弟節點也無法提供,則將L與其兄弟節點進行合并,合并后必須將父結點中對應的指針刪除;
  • 假若重新分配允許,從兄弟節點中拿來,并將兩個葉結點中的中間值復制到父結點中并修改其父節點。
    假設要插入19和20,示例如下:
    插入后結果如下:
    現在,假設我們接著要繼續刪除24*,由上圖可知,其同父節點下的兄弟節點無法滿足重新分配的條件,所以選擇將兩個葉子節點進行合并,并修改他們的父節點、刪除相應的指針。示例如下:

    合并操作后,他們的樹節點出現不滿足50%占比的情況,所以同樣對樹節點和根節點進行同樣的合并操作,得到如下圖所示的結構:
  • 3. 總結

    • ISAM:
      • 靜態樹
      • 存在overflow pages,會降低操作效率
      • 只允許修改葉子節點,不允許修改樹節點。
    • B+ Tree
      • 動態樹,樹的高度降低,集成度高。
      • 不存在overflow pages,效率比ISAM高
      • 能動態地修改根節點、樹節點、和葉子節點。

    總結

    以上是生活随笔為你收集整理的文件储存树的理解(ISAM 和 B+Tree)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。