分塊查找

分塊查找法要求將列表組織成如下索引順序結構:數組

首先將列表分紅若干個塊(子表)。通常狀況下,塊的長度均勻,最後一塊能夠不滿。spa

每塊中元素任意排列,即塊內無序,但塊與塊之間有序。code

構造一個索引表。其中每一個索引項對應一個塊並記錄每塊的起始位置,和每塊中最大blog

關鍵字(或最小關鍵字)。索引表按關鍵字有序排列。索引

下圖所示爲一個索引順序表。其中包括三個塊,第一個塊的起始地址爲 0,塊內最class

大關鍵字爲 25;第二個塊的起始地址爲 5,塊內最大關鍵字爲 58;第三個塊的起始地址爲方法

10,塊內最大關鍵字爲 88。im

分塊查找的基本過程以下:db

(1)首先,將待查關鍵字 K 與索引表中的關鍵字進行比較,以肯定待查記錄所在的word

塊。具體的可用順序查找法或折半查找法進行。

(2)進一步用順序查找法,在相應塊內查找關鍵字爲 K的元素。

分塊查找是順序查找的一種改進方法。首先須要對數組進行分塊,分塊查找須要創建一個「索引表」。索引表分爲m塊,每塊含有N/m個元素,塊內是無序的,塊間是有序的,例如塊2中最大元素小於塊3中最小元素。

先用二分查找索引表,肯定須要查找的關鍵字在哪一塊,而後再在相應的塊內用順序查找。分塊查找又稱爲索引順序查找。

時間複雜度:O(log(m)+N/m)

 1 //分塊查找  
 2 template<class T>//索引表  
 3 struct INDEXTable  
 4 {  
 5     T key;  
 6     int link;  
 7 };  
 8   
 9 template<class T>  IndexOrderSearch(INDEXTable<T> *indexTable,T *x, int N, int m, T keyword)// indexTable爲索引表,x爲原數組,N爲數組大小,m爲塊大小  
10 {  
11     int L = (N+m-1)/m;  
12     int i = 0;  
13     while(i < L && indexTable[i].key < keyword)  
14         i++;  
15     if(i == L)  
16         return -1;  
17     else  
18     {  
19         int j = indexTable[i].link;  
20         for(j; j<indexTable[i].link + m;j++)  
21             if(x[j] == keyword)  
22                 return j;         
23     }  
24     return -1;  
25 }  
相關文章
相關標籤/搜索