索引和雜湊學習 一 靜態索引結構

2021-09-30 16:00:40 字數 3101 閱讀 8014

索引結構和雜湊結構是用在外部搜尋的搜尋結構。

資料在外存中的組織的方式也就是檔案結構,主要分成順序、直接訪問(雜湊)、和索引結構。

在檔案組織中主要使用的是索引和雜湊方法。

下面是殷人昆老師的書中介紹的索引結構

當資料物件個數n 

很大時,如果用無序表形式的靜態搜尋結構儲存,採用順序搜尋,則搜尋效率極低。如果採用有序表儲存形式的靜態搜尋結構,則插入新記錄進行排序,時間開銷也很可觀。這時可採用索引方法來實現儲存和搜尋。

線性索引分成兩種:稠密索引和稀疏索引。

稠密索引

乙個索引項(位於索引表)對應資料表中乙個物件的索引結構。當物件在外存中按加入順序存放而不是按關鍵碼有序存放時必須採用稠密索引結構,這時的索引結構叫做索引非順序結構。

例如下圖:

稀疏索引

當物件在外存中有序存放時,可以把所有n 

個物件分為b 

個子表(塊)存放,乙個索引項對應資料表中一組物件(子表).在子表中,  所有物件可能按關鍵碼有序地存放,  也可能無序地存放。但所有這些子表必須分塊有序,後乙個子表中所有物件的關鍵碼均大於前乙個子表中所有物件的關鍵碼。它們都存放在資料區中。另外建立乙個索引表。索引表中每一表目叫做索引項,它記錄了子表中最大關鍵碼max_key

以及該子表在資料區中的起始位置obj_addr

。見下圖所示:

各個索引項在索引表中的序號與各個子表的塊號有一一對應的關係:第i 

個索引項是第i 

個子表的索引項,  i = 0, 1, …, n-1。這樣的索引結構叫做索引順序結構。

對索引順序結構進行搜尋時,一般分為兩級搜尋。

(1)先在索引表id 

中搜尋給定值k

,確定滿足id

[i-1].max_key

<=id

[i].max_key 

的i 值,即待查物件可能在的子表的序號。

(2)然後再在第i 

個子表中按給定值搜尋要求的物件。

索引表是按max_key

有序的,且長度也不大,可以對分搜尋,也可以順序搜尋。

各子表內各個物件如果也按物件關鍵碼有序,可以採用對分搜尋或順序搜尋;如果不是按物件關鍵碼有序,只能順序搜尋。

基於屬性的倒排

在乙個帶結構的記錄檔案中,如資料庫檔案等。檔案裡存放的都是一條接著一條的整齊的記錄,每個記錄又可分為乙個個的屬性。檢索過程往往要求找出,在某個或者某些屬性上滿足一定條件的記錄集合。像這一類的檢索我們稱為基於屬性的檢索。

對包含有大量資料物件的資料表或檔案進行搜尋時,最常用的是針對物件的主關鍵碼建立索引。主關鍵碼可以唯一地標識該物件。用主關鍵碼建立的索引叫做主索引。

主索引的每個索引項給出物件的關鍵碼和物件在表或檔案中的存放位址。

物件關鍵碼key

物件的儲存位址addr

在實際應用中有時需要針對其它屬性進行搜尋。例如,查詢如下的職工資訊:

(1) 列出所有教師的名單;

(2) 已婚的女性職工有哪些人?

這些資訊在資料表或檔案中都存在,但都不是關鍵碼,為回答以上問題,只能到表或檔案中去順序搜尋,搜尋效率極低。

因此,除主關鍵碼外,可以把一些經常搜尋的屬性設定為次關鍵碼,並針對每乙個作為次關鍵碼的屬性,建立次索引。

在次索引中,列出該屬性的所有取值(次關鍵碼),並對每乙個取值建立有序鍊錶,把所有具有相同屬性值的物件按存放位址遞增的順序或按主關鍵碼遞增的順序鏈結在一起。

次索引的索引項由次關鍵碼、鍊錶長度和鍊錶本身等三部分組成。

為了回答上述的查詢,我們可以分別建立「性別」、「婚否」和「職務」次索引

倒排表或倒排檔案是一種次索引的實現。在倒排表中所有次關鍵碼的鏈都儲存在次索引中,僅通過搜尋次索引就能找到所有具有相同屬性值的物件。

在次索引中記錄物件存放位置的指標可以用主關鍵碼表示,可以通過搜尋次索引確定該物件的主關鍵碼,再通過搜尋主索引確定物件的存放位址。

有了倒排檔案,我們就可以將查詢變成幾個集合之間的交,並等運算,得到的最後結果即時我們要求的,這樣不用挨個讀取記錄,且參與運算的資料大大減少,基本可以不用多次讀寫磁碟而直接在記憶體裡進行運算,大大提高了檢索速度。

基於文字的倒排

倒排檔案也可以應用於非結構化的資訊檢索裡面,如大量正文的文字索引。尤其當今搜尋引擎需要對海量的正文文字資訊進行檢索的情況下,倒排檔案的使用尤其重要。

倒排表(所在文件編號,出現次數, 出現位置)

kmp

(#3307, 2, 5, 43)(#4615, 3, 0, 19, 34, 70, 143)

最小支撐樹

(#2519, 1, 267)(#6742, 3, 19, 322, 526)……

貪心演算法

(#2948, 3, 45, 267, 587)(#3693, 5, 39, 423, 765,809,1024)……

…………

由於倒排索引支援高效檢索,所以應用相當廣泛。當然,對倒排表進行集合運算也需要一些運算空間,更大的缺點在於,當檔案發生變化時,要同時維護更新這些索引,而這種更新的工作量會很大,所以它比較適合於當大檔案裡面內容比較穩定的情況下。尤其像光碟上的資料檢索等就會是它最理想的應用場所之一。

當資料物件數目特別大,索引表本身也很大,在記憶體中放不下,需要分批多次讀取外存才能把索引表搜尋一遍。

在此情況下,可以建立索引的索引,稱為二級索引。二級索引可以常駐記憶體,二級索引中乙個索引項對應乙個索引塊,登記該索引塊的最大關鍵碼及該索引塊的儲存位址。

如果二級索引在記憶體中也放不下,需要分為許多塊多次從外存讀入。可以建立二級索引的索引,叫做**索引。這時,訪問外存次數等於讀入索引次數再加上1次讀取物件。

這種多級索引結構形成一種m 

叉樹。樹中每乙個分支結點表示乙個索引塊,它最多存放

m 個索引項,每個索引項分別給出各子樹結點(

低一級索引塊) 的最大關鍵碼和結點位址。

樹的葉結點中各索引項給出在資料表中存放的物件的關鍵碼和存放位址。這種m

叉樹用來作為多級索引,就是m

路搜尋樹。

m路搜尋樹可能是靜態索引結構,即結構在初始建立,資料裝入時就已經定型,在整個執行期間,樹的結構不發生變化。

m

路搜尋樹還可能是動態索引結構,即在整個系統執行期間,樹的結構隨資料的增刪及時調整,以保持最佳的搜尋效率。

Mysql B tree索引和雜湊索引

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大...

索引和雜湊

順序索引 1 稠密索引 對應檔案中搜尋碼的每乙個值有乙個索引記錄。索引記錄包括搜尋碼值以及指向具有該搜尋碼值的第乙個資料記錄的指標。可更快定位記錄。2 稀疏索引 只為搜尋碼的某些值建立索引記錄。佔空間較小,插入和刪除時的維護開銷較小。多級索引 在主索引上構造乙個稀疏索引,如果要搜尋乙個記錄,首先在外...

索引和雜湊

順序索引 1 稠密索引 對應檔案中搜尋碼的每乙個值有乙個索引記錄。索引記錄包括搜尋碼值以及指向具有該搜尋碼值的第乙個資料記錄的指標。可更快定位記錄。2 稀疏索引 只為搜尋碼的某些值建立索引記錄。佔空間較小,插入和刪除時的維護開銷較小。多級索引 在主索引上構造乙個稀疏索引,如果要搜尋乙個記錄,首先在外...