数据分块算法java_分块查询算法(JAVA)

描述:

分块查找要求索引表是有序的,对块内节点没有排序要求,因此适合于节点动态变化的情况。

分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序

步骤:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值