分块查找

分块查找将一个线性表分成若干个子表,查找时先确定目标元素所在的子表,再在该子表中查找它。我们通常会先建立一个索引表,每个元素包含每个子表的起始位置和子表中最大元素值。

整个线性表要求分块排序,即第i个子表中所有元素都小于第i+1个子表中所有元素。但是在每个子表内,元素排序是任意的,所以在子表中用顺序查找。

下面给出了一个简单的例子:

 1 //分块查找, blocking search
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct indexBlock{
 6     //maxkey为子表中最大元素值
 7     int start,end,maxkey;
 8 }indexBlocks[3];
 9 
10 int list[15]={22, 12, 13, 3, 9, 33, 42, 44, 38, 24, 60, 74, 49, 86, 53};
11 
12 void initialize(){
13     for(int i=0;i<3;i++){
14         indexBlocks[i].start=i*5;
15         indexBlocks[i].end=i*5+4;
16         int max=0;
17         for(int j=0;j<5;j++){
18             if(list[i*5+j]>max){
19                 max=list[i*5+j];
20             }
21         }
22         indexBlocks[i].maxkey=max;
23     }
24 }
25 
26 int search(int value){
27     int times=0;
28     for(int i=0;i<3;i++){
29         times++;
30         if(value<=indexBlocks[i].maxkey){
31             for(int j=indexBlocks[i].start;j<=indexBlocks[i].end;j++){
32                 times++;
33                 if(value==list[j]){
34                     cout<<times<<" ";
35                     return j;
36                 }
37             }
38             cout<<times<<" ";
39             return -1;
40         }
41     }
42     cout<<times<<" ";
43     return -1;
44 }
45 
46 
47 int main(){
48     initialize();
49     cout<<search(88)<<endl;
50 }

对于插入和删除操作,我们可以直接在线性表中插入或删除,然后更新对应子表的end和maxkey.

posted @ 2017-07-09 10:24  NoviScl  阅读(329)  评论(0编辑  收藏  举报