描述:

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

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

步骤:

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

数据分块算法java_分块查询算法(JAVA)相关推荐

  1. 模拟退火算法 java_转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享...

    以下文章来源于数据魔术师 ,作者周航 前言 大家好呀!我们你们好久不见的...咳咳,初次见面的小编! 之前重新整理了ILS的代码,有人留言问能不能提供java版. 正好最近在学启发式算法和java,为 ...

  2. kruskal算法java_克鲁斯卡尔算法(Kruskal)的java实现

    下面是我对软件工程教程里面的克鲁斯卡尔算法的实现,发现在网是很少有网友贴出,为了方便大家查询,所以贴出来了,还希望大家能多指点. package Test; import java.io.Buffer ...

  3. 河内塔算法java_河内递归塔Java

    这是我使用递归解决河内塔的Java代码: /**here is a stack of N disks on the first of three poles (call them A, B and C ...

  4. 大鱼吃小鱼算法java_大鱼吃小鱼-题解(Java代码)

    解题思路: 注意事项: 参考代码:import java.util.Arrays; import java.util.Scanner; public class C2322 { public stat ...

  5. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  6. 21朵水仙花算法java_水仙花数算法 - hi_jyf - OSCHINA - 中文开源技术交流社区

    小博在面试中碰到的这个问题,虽然写的比较简单,还是觉得有必要整理一下.当然,如果您有更好的写法,还望不吝赐教. package com.web.demo.algorithm; import java. ...

  7. shuffle洗牌算法java_洗牌算法shuffle

    洗牌算法 1.   背景 阿里的面试的时候做的一道笔试题:题目:写一个方法,入参为自然数n  (n > 0),返回一个自然数数组,数组长度为n,元素为[1,n]之间,且每个元素不重复,数组中各元 ...

  8. 抛硬币仿真实验java_探索HyperLogLog算法(含Java实现)

    引言 HyperLogLog算法经常在数据库中被用来统计某一字段的Distinct Value(下文简称DV),比如Redis的HyperLogLog结构,出于好奇探索了一下这个算法的原理,无奈中文资 ...

  9. hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践

    追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...

  10. 常见排序查询算法Java代码实现

    1. 排序算法代码实现 /*** ascending sort* 外层循环边界条件:总共需要冒泡的轮数--每一轮都将最大或最小的数冒泡到最后* 内层循环边界条件:冒泡数字移动的边界--最终数字需冒泡到 ...

最新文章

  1. iOS开发之抽屉效果实现
  2. keras从入门到放弃(二十一)LSTM处理 RNN文本分类
  3. 【福利】爱德华·阿什福德·李:人类与AI技术将是共生关系
  4. kill -9都杀不掉的进程
  5. 如何查看所安装的jdk的版本位数
  6. View Agent Direct-Connection注册表
  7. pandas.to_numeric
  8. 【离散数学】集合论 第四章 函数与集合(1) 函数定义、递归定义的函数
  9. mw150um 驱动程序win10_mercury无线网卡驱动
  10. wpf-AvalonDock基础-安装和更换主题
  11. 自然语言处理总复习(七)—— 概率上下文无关文法
  12. 斗地主发牌游戏编程java,自己做的斗地主游戏发牌C#程序
  13. BAT自动校对时间脚本,让WINDOWS系统自动校对时间
  14. 互联网金融牌照有哪些 金融牌照一览表
  15. GPS警用车辆3G视频监控系统方案
  16. 《全球概览》:嬉皮士生存指南
  17. 动态规划表格法解决最长公共子序列(LCS)问题
  18. 意念云分发是干嘛的?
  19. BIOS基础 - 什么是BIOS
  20. 北京内推 | 智源人工智能研究院招聘视觉模型算法工程师/实习生

热门文章

  1. 消息生产与消息存储——kafka源码探究之三
  2. Linux虚拟机设置Samba服务
  3. 阿里云数据库使用初体验
  4. python-socket模块基本用法收集
  5. apache的虚拟目录配置
  6. Great Song
  7. A[1062]德才论 好题
  8. ubunt Linux nginx,linux ubuntu系统安装nginx教程
  9. linux终端下载vscode,Ubuntu:安装vscode
  10. r语言列表添加元素_技术贴 | R语言:geom_smooth在散点图中添加多条回归直线