二、分塊查詢的基本思想
三、分塊查詢示例
四、演算法分析——平均查詢長度asl
索引順序查詢又稱分塊查詢(blocking search)。它是一種效能介於順序查詢和二分查詢之間的查詢方法。
查詢表由"分塊有序"的線性表和索引表組成。
表r[1…n]均分為b塊,前b-1塊中結點個數為s=[n/b],第b塊的結點數小於等於s;每一塊中的關鍵字不一定有序,但前一塊中的最大關鍵字必須小於後一塊中的最小關鍵字,即表是"分塊有序"的。
抽取各塊中的最大關鍵字及其起始位置構成乙個索引表id[l…b],即idi中存放第i塊的最大關鍵字及該塊在表r中的起始位置。由於表r是分塊有序的,所以索引表是乙個遞增有序表。
【例】下圖就是滿足上述要求的儲存結構,其中r只有18個結點,被分成3塊,每塊中有6個結點,第一塊中最大關鍵字22小於第二塊中最小關鍵字24,第二塊中最大關鍵字48小於第三塊中最小關鍵字49。
1、首先查詢索引表
索引表是有序表,可採用二分查詢或順序查詢,以確定待查的結點在哪一塊。
2、然後在已確定的塊中進行順序查詢
由於塊內無序,只能用順序查詢。
【例】對於上例的儲存結構:
1、查詢關鍵字等於給定值k=24的結點
因為索引錶小,不妨用順序查詢方法查詢索引表。即首先將k依次和索引表中各關鍵字比較,直到找到第1個關鍵宇大小等於k的結點,由於k<48,所以關鍵字為24的結點若存在的話,則必定在第二塊中;然後,由id[2].addr找到第二塊的起始位址7,從該位址開始在r[7…12]中進行順序查詢,直到r[11].key=k為止。
2、查詢關鍵字等於給定值k=30的結點
先確定第二塊,然後在該塊中查詢。因該塊中查詢不成功,故說明表中不存在關鍵字為30的結點。
分塊查詢是兩次查詢過程。整個查詢過程的平均查詢長度是兩次查詢的平均查詢長度之和。
①以二分查詢來確定塊,分塊查詢成功時的平均查詢長度
aslblk=aslbn+aslsq≈log(b+1)-1+(s+1)/2≈log(n/s+1)+s/2
②以順序查詢確定塊,分塊查詢成功時的平均查詢長度
asl』blk=(b+1)/2+(s+1)/2=(n/s+s)/2+1
可見,平均查詢長度不僅和n有關還和s有關,在n已經確定的情況下,s是可以選擇的。容易證明 ,當s=sqrt(n)時,asl=sqrt(n)+1。
分塊查詢比順序查詢要快,但不如折半查詢。
索引順序查詢(分塊查詢)
索引順序查詢又叫分塊查詢,它是介於順序查詢和折半查詢之間的一種查詢方法。折半查詢雖然具有很好的效能,但其前提條件是線性表順序儲存而且按照關鍵字排序,這一前提條件在結點數很大且表元素動態變化時難以滿足。而順序查詢雖然可以解決表元素動態變化的要求,但查詢效率很低。如果既要保持查詢效率,又要能夠滿足表元素...
索引順序表查詢演算法(分塊查詢演算法)
有時候,可能會遇到這樣的表 整個表中的元素未必有序,但若劃分為若干塊後,每一塊中的所有元素均小於 或大於 其後面塊中的所有元素。我們稱這種為分塊有序。首先,我們需要先建立乙個索引表,索引表中為每一塊都設定 索引項,每乙個索引項都包含兩個內容 在前面建立的索引表的基礎上,我們查詢乙個關鍵字需要兩個步驟...
分塊索引(查詢)
什麼叫做分塊索引?分塊索引就是對資料集進行分塊,使得分塊有序,然後再對每一塊建立乙個索引項,從而減少索引項個數。分塊查詢是折半查詢和順序查詢的一種改進方法,折半查詢雖然具有很好的效能,但其前提條件時線性表順序儲存而且按照關鍵碼排序,這一前提條件在結點樹很大且表元素動態變化時是難以滿足的。而順序查詢可...