基礎演算法 查詢 線性索引查詢(I)

2022-04-10 13:34:48 字數 3226 閱讀 9390

前面介紹的幾種查詢的演算法都是基於資料有序的基礎上進行的。但是在實際的應用中,很多資料集可能有驚人的資料量,面對這些海量的資料,要保證記錄全部按照當中的某個關鍵字有序,其時間代價是非常昂貴的,所以這種資料通常都是按先後順序儲存的。

那麼如何能夠快速的查詢到需要的資料呢?辦法就是--索引。

索引就是把乙個關鍵字與它對應的記錄相關聯的過程。乙個索引有若干個索引項構成,每個索引項至少應包括關鍵字和對應的記錄在儲存器中的位置等資訊。

在索引表中的每個索引項對應多條記錄,則稱為稀疏索引,若每個索引項唯一對應一條記錄,則稱為稠密索引。

索引按照結構可以分為線性索引、樹形索引和多級索引。所謂的線性索引就是將索引項集合組織為線性結構,也稱為索引表。

稠密索引

索引項有序也就意味著,在查詢關鍵字時,可以用到折半、插值、斐波那契等有序的查詢演算法。

稠密索引的改進的地方在於:它簡化了龐大的原資料集,使原本不能裝入記憶體的龐大的資料集,能一次性的裝入記憶體,並且能夠在記憶體中實現關鍵字碼的排序,並且每乙個索引項能夠指向磁碟中它代表的原資料記錄。

能利用高階的查詢演算法,這顯然是稠密索引的優點,但是如果資料集非常的大,那麼索引表也是非常的大,對於記憶體有限的計算機來說,不得不把索引表也放到磁碟中,這樣就大大的降低了效率。

分塊索引

稠密索引因為索引項與資料集的記錄個數相同,所以空間代價很大。為了減少索引項的個數,對資料集進行分塊,使其分塊有序,然後在對每一塊建立乙個索引項,從而減少索引項的個數。

分塊有序,就是把資料集的記錄分成了若干塊,這些塊需要滿足的條件是:

塊內無序,塊間有序。

上圖中定義的索引項的結構分為三個資料項:

(1)最大關鍵碼,它儲存了每一塊中的最大關鍵字,這樣的好處是可以使得在它之後的下一塊中的最小關鍵字也能比這一塊最大的關鍵字要大。當然這個索引關鍵字碼可以是任何能夠唯一標識乙個塊的任何資料。

(2)儲存了塊中記錄的個數,以便於迴圈時使用。

(3)用於指向塊首資料元素的指標,便於開始對這一塊中記錄遍歷

分塊索引如果在索引表和每個塊內的記錄都採用順序表查詢,那麼時間複雜度分析就如下:

分塊索引表的平均查詢長度分析

設有n個記錄,被分成了m塊,每塊有t條記錄。顯然n=mxt。在索引表和塊中的平均查詢長度分別是lb和lw。

上面的分析中,在塊間使用的也是順序查詢,因為塊間是有序的,所以可以使用折半查詢等快速的演算法來提高效率。

//建立索引項結構

struct indexitem

;//建立索引表

typedef struct indexitem indexlist[ilmsize]; //ilmsize為事先定義好的整型常量,大於等於索引項數目m

//建立原始資料的主表

int mainlist[maxsize]; //maxsize為事先定義好的整型常量,大於等於主表中的記錄的個數n

/** 輸入:主表a,索引表b,索引表中索引項數目m,要搜尋的元素elem

* 輸出:找到的元素的下標

*/int blocksearch(mainlist a, indexlist b, int m, int elem)

}//for

if(i == m)

int endnum = b[i].start + b[i].length;

for(int j = b[i].start; j < num; j++)

}//for

if(j < num)

if(j == num)

}

若 indexkeytype 被定義為字串型別,則演算法中相應的條件改為

strcmp (k1, b[i].index) == 0;

同理,若keytype 被定義為字串型別

則演算法中相應的條件也應該改為

strcmp (k2, a[j].key) == 0

若每個子表在主表a中採用的是鏈結儲存,則只要把上面演算法中的while迴圈

和其後的if語句進行如下修改即可:

while (j != -1)//用-1作為空指標標記

return j;

在索引表中折半查詢的偽**

//在索引表中折半查詢偽**

while low <= high

mid = (low + high)/2

if a[mid-1]elem

high = mid - 1

else if elem > a[mid]

low = mid + 1

if low > high

i = low

在索引表中折半查詢的**實現

//在索引表中折半查詢**實現

while(low <= high)

else if(b[mid - 1].index > elem)

else

}//while

if(low > high)

分塊索引表的建立這樣就能很好的實現,大的資料塊儲存在磁碟上,索引表儲存於記憶體中了。這種模型是不需要對原始資料集進行排序操作的,因為塊與塊之間是可以不連續的存放的。在原始資料產生前確定分多少塊,以及每個塊的儲存位置(塊間位置不連續,塊內位置連續),這時每個塊內的儲存資料的範圍也要確定,當新的資料到來的時候,就能確定要把這個資料放到哪個塊中。

舉個例子:

我想設計乙個分塊索引來查詢資料,大體估算有3600個資料,所以根據能使演算法效率最高的分塊數目等於每一塊的記錄數目。設定60個塊,每個塊有60個記錄。60個塊就對應磁碟上的60個資料夾目錄用來儲存資料,這60個塊的塊間位置不連續。同時假設這3600個記錄的關鍵字大小範圍是1-3000,那麼第一塊就儲存1-50的記錄。來乙個新紀錄,如果關鍵字在1-50之間,就直接把它追加到第一塊中。同時如果這個記錄的關鍵字值大於索引表中的最大關鍵碼,就對索引表中的最大關鍵字碼更新。

查詢 線性索引查詢

索引就是把乙個關鍵字與它對應的記錄相關聯的過程,乙個索引由若干個索引項構成,每個索引項至少應包含關鍵字和其對應的記錄在儲存器中的位置等資訊。索引技術是組織大型資料庫以及磁碟檔案的一種重要技術。索引按照結構可以分為線性索引 樹形索引和多級索引。這裡只 線性索引,即將索引項集合組織為線性結構,也稱為索引...

線性索引查詢

索引就是把乙個關鍵字與它對應的記錄相關聯的過程,乙個索引由若干個索引項構成,每個索引項至少應包含關鍵字和其對應的記錄在儲存器中的位置等資訊。索引技術是組織大型資料庫以及磁碟檔案的一種重要技術。索引按照結構可以分為線性索引 樹形索引和多級索引。所謂的線性索引就是將索引項集合組織為線性結構,也稱為索引表...

線性索引查詢

本文參考自 大話資料結構 資料結構的最終目的是提高資料的處理速度,索引就是為了加快查詢速度而設計得一種資料結構。索引就是把乙個關鍵字與它對應的記錄相關聯的過程。索引按結構可以分為線性索引 樹形索引和多級索引。我們這裡只介紹線性索引。所謂線性索引就是將索引項集合組織為線性結構,也稱為索引表。重點介紹三...