索引順序查找又稱分塊查找(Blocking Search)。它是一種性能介於順序查找和二分查找之間的查找方法。
一、分塊查找表存儲結構
查找表由"分塊有序"的線性表和索引表組成。
1、"分塊有序"的線性表
表R[1…n]均分爲b塊,前b-1塊中結點個數爲s=[n/b],第b塊的結點數小於等於s;每一塊中的關鍵字不一定有序,但前一塊中的最大關鍵字必須小於後一塊中的最小關鍵字,即表是"分塊有序"的。
2、索引表
抽取各塊中的最大關鍵字及其起始位置構成一個索引表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的結點。
四、算法分析——平均查找長度ASL
分塊查找是兩次查找過程。整個查找過程的平均查找長度是兩次查找的平均查找長度之和。
①以二分查找來確定塊,分塊查找成功時的平均查找長度
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。
分塊查找比順序查找要快,但不如折半查找。