知识分享: 热门博客
5、分块查找
(1)概述: 分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
(2)算法流程: 先选取各块中的最大关键字构成一个索引表;查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
(3)要点: 算法的思想是将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序",每个块内的的最大元素小于下一块所有元素的任意一个值。
(4)基本思想: 给定一个待查找的key,在查找这个key值位置时,会先去索引表中利用顺序查找或者二分查找来找出这个key所在块的索引开始位置,然后再根据所在块的索引开始位置开始查找这个key所在的具体位置。
(5)时间复杂度分析: 先按二分查找去找key在索引表为大概位置(所给出代码是顺序查找),然后在主表中的可能所在块的位置开始按顺序查找,所以时间复杂度为O(log₂(m)+N/m),m为分块的数量,N为主表元素的数量,N/m 就是每块内元素的数量。
5-1、实现代码
- Java实现方式一:
/*
* 分块查找
*/
/**
* @param index 每个元素代表的是每块的最大值
* @param array 代表的是要查找的数组
* @param key 代表要查找的元素
* @param m 代表每个块的大小
* @return
*/
public static int blockSearch(int[] index,int[] array,int key,int m) {
int i=search(index,key);
if(i<0)
return -1;
for(int j=m*i,length=j+m;j<length;j++) {
if(array[j]==key)
return j;
}
return -1;
}
public static int search(int[] index,int key) {
int start=0;
int end=index.length-1;
if(key>index[end])
return -1;
while(start<=end) {
int mid=start+((end-start)>>1);
if(index[mid]>=key) {
end=mid-1;
}else {
start=mid+1;
}
}
return start;
}
5-2、测试
int[] index= {19,336,100};
int[] array= {19,2,3,4,6,7,8,30,40,50,336,20,76,89,100,90,46,66};
Scanner scan=new Scanner(System.in);
System.out.println("请输入要查找的数:");
int a=scan.nextInt();
System.out.println(blockSearch(index,array,a,6));
输出结果:
5-3、方法解析
- 分块查找时折半查找和顺序查找的一种改进的方法,分块查找由于只要求索引表是有序的,对块内节点没有排序的要求,因此特别适合于节点动态变化的情况。
- 分块查找要求把一个数据分为若干块,每一个块里面的元素可以是无序的,但是块与块之间的元素需要是有序的。即第一块中任一元素的关键字都必须小于第二块中任一元素的关键字;而第二块中任一元素又必须小于第三块的任一元素,…。
- search方法表示查找的在哪个块中,确定某个块之后,然后在那个块中进行查找。
上篇博文:查找算法04-斐波拉契查找
下篇博文:查找算法06-哈希查找