標籤:style blog http color ar strong 2014 sp log
轉自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm
分塊尋找
分塊尋找(Blocking Search)又稱索引順序尋找。它是一種效能介於順序尋找和二分尋找之間的尋找方法。
1、 二分尋找表格儲存體結構
二分尋找表由"分塊有序"的線性表和索引表組成。
(1)"分塊有序"的線性表
表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。
2、分塊尋找的基本思想
分塊尋找的基本思想是:
(1)首先尋找索引表
索引表是有序表,可採用二分尋找或順序尋找,以確定待查的結點在哪一塊。
(2)然後在已確定的塊中進行順序尋找
由於塊內無序,只能用順序尋找。
3、分塊尋找樣本
【例】對於上例的儲存結構:
(1)尋找關鍵字等於給定值K=24的結點
因為索引表小,不妨用順序尋找方法尋找索引表。即首先將K依次和索引表中各關鍵字比較,直到找到第1個關鍵宇大小等於K的結點,由於K<48,所以關鍵字為24的結點若存在的話,則必定在第二塊中;然後,由ID[2].addr找到第二塊的起始地址7,從該地址開始在R[7..12]中進行順序尋找,直到R[11].key=K為止。
(2)尋找關鍵字等於給定值K=30的結點
先確定第二塊,然後在該塊中尋找。因該塊中尋找不成功,故說明表中不存在關鍵字為30的結點。
具體過程【參見動畫示範】
4、演算法分析
(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)分塊尋找的優點
分塊尋找的優點是:
①在表中插入或刪除一個記錄時,只要找到該記錄所屬的塊,就在該塊內進行插入和刪除運算。
②因塊內記錄的存放是任意的,所以插入或刪除比較容易,無須移動大量記錄。
分塊尋找的主要代價是增加一個輔助數組的儲存空間和將初始表分塊排序的運算。
轉:線性表的尋找-分塊尋找