1. 程式人生 > >修煉內功---資料結構與演算法19---分塊索引

修煉內功---資料結構與演算法19---分塊索引

提到了稠密索引的缺點,進而引出今天的主題 —— 分塊索引

  • 為了減少索引項個數,我們對資料集進行分塊,並使其分塊有序

  • 然後再給每個分塊建立一個索引項(索引值是分塊中最大關鍵碼),至於分塊內部,則不管其有序性,從而減少索引項的個數

  • 在查詢的時候在索引項中通過二分查詢找到指定索引項,然後根據該索引項中的關鍵碼去相應分塊遍歷查詢指定元素

  • 這是一種折中方案,既兼顧了空間複雜度,又兼顧了時間複雜度

分塊索引圖示如下:

這裡面有幾個概念需要闡述下

首先是分塊有序,需要滿足兩個先決條件:

  • 塊內無序,即每一塊內的記錄不要求有序,有序更理想,只不過要花費大量時間和空間的代價

  • 塊間有序看,即要求後一塊的所有關鍵字都大於前一塊的所有關鍵字,只有塊間有序,才能給查詢帶來效率

其次,分塊索引的索引項包含三個資料項:

  • 最大關鍵碼:它儲存每一塊中的最大關鍵字,這樣做的好處是在它之後的下一塊中最小的關鍵字也能比這一塊最大的關鍵字要大

  • 塊長:儲存塊中的記錄個數,以便於迴圈時使用

  • 塊首指標:用於指向塊首資料元素的指標,便於開始對這一塊的記錄開始遍歷

最後,在分塊索引中查詢,分兩塊進行:

  • 在分塊索引表中查詢要查詢關鍵字所在的塊,由於塊間有序,所以可以通過二分查詢快速定位(通過不小於給定值的第一個元素,不大於給定值的最後一個元素確定區間,以前面給出的示例圖為例,58位於57和96之間,則會去第三塊中查詢)

  • 根據塊首指標找到相應的塊,並在塊中順序查詢指定值(即關鍵碼,塊中無序所以只能順序查詢)

分塊索引的時間複雜度是:O(log(m)+n),其中 m 是分塊數,n 是塊內元素個數,在索引表長度和塊內元素相等時,時間複雜度最優。效能要優於順序查詢,但是比二分查詢要差

總體來說,分塊索引在兼顧儲存空間和查詢效能的情況下,被普遍用於資料庫查詢等技術中