1. 程式人生 > 實用技巧 >13.線性索引查詢---稠密索引、分塊索引、倒排索引

13.線性索引查詢---稠密索引、分塊索引、倒排索引

/*
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秒。由於單詞表是有序的,查詢效率很⾼,返回的⼜只是⽂章的編號,所以整體速度都⾮常快。
*/