算法思想
1.将n个数据元素"按块有序"划分为m块(m ≤ n)。
2.每一块中的结点不必有序,但块与块之间必须"按块有序";
3.即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;
4.而第2块中任一元素又都必须小于第3块中的任一元素,……
分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。
/**
* 分块查找
* @author qiu
* 时间复杂度:O(log(m)+N/m)
*/
public class BlockSearch {
//index代表索引数组,arr代表待查找数组,key代表要查找的元素,m代表每块大小
public static int blocksearch(int[] index,int[]arr,int key,int m){
int i=shunxusearch(index,key,index.length); //shunxunsearch函数返回值为带查找元素在第几块
System.out.println("在第"+i+"块");
if(i>=0){
int j=m*i; //j为第i块的第一个元素下标
int curlen=(i+1)*m;
for(;j<curlen;j++){
if(arr[j]==key)
return j;
}
}
return -1;
}
//二分查找、查找key所在的块数
public static int shunxusearch(int[]index,int key,int m){
int low=0,high=m-1,mid;
int found=0;
while(low<=high&&found!=1){
mid=(low+high)/2;
if(key==index[mid]){
high=mid-1;
found=1;
}else if(key<index[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
//查找完毕,high为key所在的前一个块的块号
return high+1;
}
public static void main(String[] args) {
int index[]={6,22,48,86}; //建立索引表
int st2[]={1,3,4,5,0,2,22, 12, 13, 8, 9, 20, 33, 42, 44, 38, 24, 48, 60, 58, 74, 49, 86, 53};
int a=blocksearch(index,st2,3,6);
System.out.println(a);
}
}