本文參考自《大話資料結構》資料結構的最終目的是提高資料的處理速度,索引就是為了加快查詢速度而設計得一種資料結構。索引就是把乙個關鍵字與它對應的記錄相關聯的過程。
索引按結構可以分為線性索引、樹形索引和多級索引。我們這裡只介紹線性索引。所謂線性索引就是將索引項集合組織為線性結構,也稱為索引表。重點介紹三種線性索引:稠密索引、分塊索引和倒排索引。
如圖,左邊的表是線性索引表,每個索引項都指向了右邊的資料表
索引項有序也就意味著,我們要查詢關鍵字時,可以用到折半、插值、斐波那契等有序查詢演算法,提高效率。
但如果資料集非常大,比如上億,那就意味著索引也得同樣的資料集長度規模,對於記憶體有限的計算機來說,可能就需要反覆區訪問磁碟,查詢效能反而大大下降了。
稠密索引因為索引項與資料集的記錄個數相同,所以空間代價很大。為了減少索引項的個數,可以對資料集進行分塊,使其分塊有序,然後再對每一塊建立乙個索引項,從而減少索引項的個數。
分塊有序,是把資料集的記錄分成了若干塊,並且這些塊需要滿足兩個條件:
對於分塊有序的資料集,將每塊對應乙個索引項,這種索引方法叫做分塊索引。
分塊索引的索引結構分三個資料項:
在分塊索引表中查詢,就是分兩步進行:
在分塊索引表中查詢要查關鍵字所在的塊。由於分塊索引表是塊間有序的,因此很容易利用折半、插值等演算法得到結果;
根據塊首指標找到相應的塊,並在塊中順序查詢關鍵碼。因為塊中可以是無序的,因此只能順序查詢。
分析一下分塊索引的平均查詢長度。設n個記錄的資料集被平均分為m
塊,每個塊中有t
條記錄,顯然n=m*t
,或者說,m=n/t
。再假設lb
為查詢索引表的平均查詢長度,因最好與最差的等概率原則,所以lb
的平均長度為(m+1)/2
。lw
為塊中查詢記錄的平均查詢長度,同理可知它的平均查詢長度為(t+1)/2
。這樣分塊索引查詢的平均查詢長度為:aslw=lb+lw=0.5*(m+t)=0.5*(n/t+t)+1
上面這個式子的推導是為了讓整個分塊索引查詢長度依賴n
和t
兩個變數。從這可以得到,平均長度不僅僅取決於資料集的總記錄數n
,還和每一塊的記錄個數t
相關。最佳的清空就是分的塊數m
與塊中的記錄數t
相同,此時意味著aslw=√(n)+1
可以看到分塊索引的效率比順序查詢的o(n)
高了不少,不過與折半查詢的o(logn)
相比還有不小差距。因此在確定所在塊的過程中,由於塊間有序,所以可以應用折半、插值等手段來提高效率。
總的來說,分塊索引在兼顧了對細分塊不需要有序的情況下,大大增加了整體查詢的速度,所以普遍被用於資料庫表查詢等技術的應用當中。
下圖記錄的是某個單詞在第幾篇文章存在
索引表的索引項的通用結構是:
其中記錄號表儲存具有相同次關鍵字的所有記錄的記錄號(可以是指向記錄的指標或者是該記錄的主關鍵字)。這樣的索引方法就是倒排索引(inverted index)。倒排索引源於實際應用中需要根據屬性(或字段、次關鍵碼)的值來查詢記錄。這種索引表中的每一項都包括乙個屬性值和具有該屬性值得各記錄的位址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引。
倒排索引的優點顯然就是查詢記錄非常快,基本等於生成索引表後,查詢時都不用去讀取記錄,就可以得到結果。但它的缺點是這個記錄號不長。若對多篇文章所有單詞建立倒排索引,那每個單詞都將對應相當多的文章編號,維護比較困難,插入和刪除操作都需要相應的處理。
查詢 線性索引查詢
索引就是把乙個關鍵字與它對應的記錄相關聯的過程,乙個索引由若干個索引項構成,每個索引項至少應包含關鍵字和其對應的記錄在儲存器中的位置等資訊。索引技術是組織大型資料庫以及磁碟檔案的一種重要技術。索引按照結構可以分為線性索引 樹形索引和多級索引。這裡只 線性索引,即將索引項集合組織為線性結構,也稱為索引...
線性索引查詢
索引就是把乙個關鍵字與它對應的記錄相關聯的過程,乙個索引由若干個索引項構成,每個索引項至少應包含關鍵字和其對應的記錄在儲存器中的位置等資訊。索引技術是組織大型資料庫以及磁碟檔案的一種重要技術。索引按照結構可以分為線性索引 樹形索引和多級索引。所謂的線性索引就是將索引項集合組織為線性結構,也稱為索引表...
線性索引查詢
索引 就是把乙個關鍵字與它對應的記錄相關聯的過程,乙個索引由若干個索引項構成,每個索引項至少應包含關鍵字和其對應的記錄在儲存器中的位置等資訊。索引按照結構可以分為 線性索引 樹形索引和多級索引。線性索引是將索引項集合組織為線性結構,也稱為索引表。包括稠密索引 分塊索引 倒排索引。乙個完美的引子 將資...