查找算法之分块查找

算法思想
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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值