描述:
分块查找要求索引表是有序的,对块内节点没有排序要求,因此适合于节点动态变化的情况。
分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序
步骤:
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;
step3 然后,在已确定的块中用顺序法进行查找。
索引表的长度最佳为数据总长度开根号;package cn.ljonah.search;
import java.util.ArrayList;
/**
* @Descript:分块查找
*
* @author LJonah 2018年3月12日
*/
public class BlockSearch {
private int[] index;//建立索引
private ArrayList[] list;
/**
* @Descript:初始化索引
*
* @author LJonah 2018年3月12日
* @param index
*/
public BlockSearch(int[] index){
if(null != index && index.length!=0){
this.index = index;
this.list = new ArrayList[index.length];
for (int i = 0;i < list.length;i++) {
list[i] = new ArrayList();//初始化容器
}
}else{
throw new Error("index cannot be null or empty");
}
}
/**
* @Descript:插入索引
*
* @author LJonah 2018年3月12日
* @param value
*/
public void insert(int value){
int i = binarySearch(value);
list[i].add(value);
}
/**
* @Descript:二分法查找
*
* @author LJonah 2018年3月12日
* @param value
* @return
*/
private int binarySearch(int value){
int start = 0,end =index.length;int mid = -1;
while(start<=end){
mid=(start+end)/2;
if(index[mid]>value){
end = mid -1;
}else{
//如果相等,也插入后面
start = mid+1;
}
}
return start;
}
/**
* @Descript:查找元素
*
* @author LJonah 2018年3月12日
* @param data
* @return
*/
public boolean search(int data)
{
int i=binarySearch(data);
for(int j=0;j
{
if(data==(int)list[i].get(j))
{
System.out.println(String.format("查找元素为第: %d块 第%d个 元素", i+1,j+1));
return true;
}
}
return false;
}
/**
* @Descript:打印每块的元素
*
* @author LJonah 2018年3月12日
*/
public void printAll(){
for (int i = 0; i < list.length; i++) {
ArrayList l = list[i];
System.out.println("ArrayList["+i+"]:");
for (int j = 0; j < l.size(); j++) {
System.out.println(l.get(j)+" ");
}
}
}
/**
* @Descript:测试
*
* @author LJonah 2018年3月12日
* @param args
*/
public static void main(String[] args) {
int []index={10,20,30};
BlockSearch blocksearch=new BlockSearch(index);
blocksearch.insert(1);
blocksearch.insert(11);
blocksearch.insert(21);
blocksearch.insert(2);
blocksearch.insert(12);
blocksearch.insert(22);
blocksearch.insert(5);
blocksearch.insert(15);
blocksearch.insert(25);
blocksearch.printAll();
System.out.println("查找值15 结果"+blocksearch.search(15));
System.out.println("查找值29 结果"+blocksearch.search(29));
}
}
测试结果:ArrayList[0]:
1
2
5
ArrayList[1]:
11
12
15
ArrayList[2]:
21
22
25
查找元素为第: 2块 第3个 元素
查找值15 结果true
查找值29 结果false