13.線性索引查詢---稠密索引、分塊索引、倒排索引
阿新 • • 發佈:2020-07-02
/* 8.5 線性索引查詢 前面幾種比較高效的查詢方法都是基於有序的基礎之上的,但事實上,很多資料集可能增長非常快, 例如,某些微博網站或者一些伺服器的日誌資訊記錄。 資料結構的最終目的是提高資料的處理速度,索引是為了加快查詢速度而設計的一種資料結構。 索引就是把一個關鍵字與它對應的記錄相關聯的過程,一個索引由若干個索引項構成,每個索引項 至少應包含關鍵字和其對應的記錄再儲存器中的位置等資訊。索引技術是組織大型資料庫以及磁碟檔案的一種重要技術。 索引按照結構可以分為線性索引、樹形索引和多級索引。我們這裡就只介紹線性索引技術。所謂的線性索引 就是將索引項集合組織為線性結構,也成為索引表。我們重點介紹三種線性索引:稠密索引、分塊索引和倒排索引。 8.5.1 稠密索引 我母親年紀大了,記憶力不好,經常在家裡找不到東西,於是他想到了一個辦法。她用一小本子記錄了家裡所有 小東西放置的位置,比如戶口本放在右手床頭櫃下面抽屜中,針線放在電視櫃中間的抽屜中,鈔票放在衣櫃... 總之,她老人家把這些小物品的放置位置都記錄在了小本子上,並且每隔一段時間還按照本子整理一遍家中的物品, 用完都放回原處,這樣她就幾乎再沒有找不到東西。 從這件事就可以看出,家中的物品儘管是無序的,但是如果有一個小本子記錄,尋找起來也是非常容易, 而這個小本子就是索引。 稠密索引是指線上性索引中,將資料集中的每個記錄對應一個索引項,如下圖: 稠密索引 原型圖片 剛才的小例子和稠密索引還是略有不同,家裡的東西畢竟少,小本子再多也就幾十頁,全部翻看完就幾分鐘時間,而 稠密索引要應對的可能是成千上萬的資料,因此對於稠密索引這個索引表來說,索引項一定是按照關鍵碼有序排列。 索引有序也就意味著,我們查詢關鍵字時,可以用到折半、插值、斐波那契等有序查詢演算法,大大提高了效率。 8.5.2 分塊索引 回想下圖書館時如何藏書的。顯然他不會時順序擺放的,給我們一個稠密索引表去查,然後再找到書給你。 圖書館的圖書分類擺放是一門非常完整的科學體系,而它最重要的一個特點就是分塊。 稠密索引因為索引項於資料集的記錄個數相同,所以空間代價很大。 為了減少索引項的個數,我們可以對資料集進行分塊,使其分塊有序,然後再對每一塊建立一個索引項, 從而減少索引項的個數。 分塊有序,是把資料集的記錄分成若干塊,並且這些塊需要滿足兩個條件: 1.塊內無序,即每一塊內的記錄不要求有序。當然,你如果能夠讓塊內有序對查詢來說更理想,不過這就要付出 大量時間和空間的代價,因此通常我們不要求塊內有序。 2.塊間有序,例如,要求第二塊所有記錄的關鍵字均要大於第一塊中所有記錄的關鍵字,第三塊的所有記錄的關鍵字 均要大於第二塊的所有記錄關鍵字.....因為只有塊間有序,才有可能在查詢時帶來效率。 定義分塊索引的索引項結構分三個資料項: 最大關鍵碼,他儲存每一塊中最大關鍵字; 儲存塊中的記錄個數; 用於指向塊首資料元素的指標; 分塊索引表中查詢步驟: 1.在分塊索引表中查詢要查關鍵字所在的塊。由於分塊索引表是塊間有序的,因此很容易利用折半、插值等演算法得到結果。 2.根據塊首指標找到相應的塊,並在塊中順序查詢關鍵碼。因為塊中可以是無序的,因此只能循序查詢。 8.5.3 倒排索引 搜尋引擎中就使用了倒排索引,無論你查什麼樣的資訊,它都可以在極短時間內給你一些結果。 我們來看樣例,現在有兩篇極短的英⽂“⽂章”——其實只能算是句 ⼦,我們暫認為它是⽂章,編號分別是1和2。 1.Books and friends should be few but good.(讀書如交友,應求少⽽精。) 2.A good book is a good friend.(好書如摯友。) 假設我們忽略掉如“books”、“friends”中的複數“s”以及如“A”這樣的⼤⼩寫差異。我們可以整理出這樣⼀張單詞表,如表8-5-1所⽰,並將單 詞做了排序,也就是表格顯⽰了每個不同的單詞分別出現在哪篇⽂章中,⽐如“good”它在兩篇⽂章中都有出現,⽽“is”只是在⽂章2中才有 英⽂單詞 ⽂章編號 a 2 and 1 be 1 book 1,2 but 1 few 1 friend 1,2 good 1,2 is 2 should 1 有了這樣⼀張單詞表,我們要搜尋⽂章,就⾮常⽅便了。如果你在搜尋框中填寫“book”關鍵字。系統就先在這張單詞表中有序查 找“book”,找到後將它對應的⽂章編號1和2的⽂章地址(通常在搜尋引擎中就是⽹⻚的標題和連結)返回,並告訴你,查詢到兩條記錄, ⽤時0.0001秒。由於單詞表是有序的,查詢效率很⾼,返回的⼜只是⽂章的編號,所以整體速度都⾮常快。*/