分塊查找(Blocking Search)又稱索引順序查找。它是一種性能介於順序查找和二分查找之間的查找方法。算法
分塊查找的基本思想是:數組
(1)首先查找索引表性能
索引表是有序表,可採用二分查找或順序查找,以肯定待查的結點在哪一塊。spa
(2)而後在已肯定的塊中進行順序查找
orm
因爲塊內無序,只能用順序查找。排序
二分查找表由"分塊有序"的線性表和索引表組成。索引
(1)"分塊有序"的線性表it
表R[1..n]均分爲b塊,前b-1塊中結點個數爲,第b塊的結點數小於等於s;每一塊中的關鍵字不必定有序,但前一塊中的最大關鍵字必須小於後一塊中的最小關鍵字,即表是"分塊有序"的。效率
(2)索引表
方法
抽取各塊中的最大關鍵字及其起始位置構成一個索引表ID[l..b],即:ID[i](1≤i≤b)中存放第i塊的最大關鍵字及該塊在表R中的起始位置。因爲表R是分塊有序的,因此索引表是一個遞增有序表。
【例】下圖就是知足上述要求的存儲結構,其中R只有18個結點,被分紅3塊,每塊中有6個結點,第一塊中最大關鍵字22小於第二塊中最小關鍵字24,第二塊中最大關鍵字48小於第三塊中最小關鍵字49。
【例】對於上例的存儲結構:
(1)查找關鍵字等於給定值K=24的結點
由於索引表小,不妨用順序查找方法查找索引表。即首先將K依次和索引表中各關鍵字比較,直到找到第1個關鍵宇大小等於K的結點,因爲K<48,因此關鍵字爲24的結點若存在的話,則一定在第二塊中;而後,由ID[2].addr找到第二塊的起始地址7,從該地址開始在R[7..12]中進行順序查找,直到R[11].key=K爲止。
(2)查找關鍵字等於給定值K=30的結點
先肯定第二塊,而後在該塊中查找。因該塊中查找不成功,故說明表中不存在關鍵字爲30的結點。
(1)平均查找長度ASL
分塊查找是兩次查找過程。整個查找過程的平均查找長度是兩次查找的平均查找長度之和。
① 以二分查找來肯定塊,分塊查找成功時的平均查找長度
ASLblk=ASLbn+ASLsq≈lg(b+1)-1+(s+1)/2≈lg(n/s+1)+s/2
② 以順序查找肯定塊,分塊查找成功時的平均查找長度
ASL'blk=(b+1)/2+(s+1)/2=(s2+2s+n)/(2s)
注意:
當 s= 時ASL'blk取極小值
+1 ,即當採用順序查找肯定塊時,應將各塊中的結點數選定爲
。
【例】若表中有10000個結點,則應把它分紅100個塊,每塊中含100個結點。用順序查找肯定塊,分塊查找平均須要作100次比較,而順序查找平均需作5000次比較,二分查找最多需14次比較。
注意:
分塊查找算法的效率介於順序查找和二分查找之間。
(2)塊的大小
在實際應用中,分塊查找不必定要將線性表分紅大小相等的若干塊,可根據表的特徵進行分塊。
【例】一個學校的學生登記表,可按系號或班號分塊。
(3) 結點的存儲結構
各塊可放在不一樣的向量中,也可將每一塊存放在一個單鏈表中。
(4)分塊查找的優勢
① 在表中插入或刪除一個記錄時,只要找到該記錄所屬的塊,就在該塊內進行插入和刪除運算。
② 因塊內記錄的存放是任意的,因此插入或刪除比較容易,無須移動大量記錄。
(5)分塊查找的缺點
分塊查找的主要代價是增長一個輔助數組的存儲空間和將初始表分塊排序的運算。