分块查找
分块查找将一个线性表分成若干个子表,查找时先确定目标元素所在的子表,再在该子表中查找它。我们通常会先建立一个索引表,每个元素包含每个子表的起始位置和子表中最大元素值。
整个线性表要求分块排序,即第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.