数据分块算法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
数据分块算法java_分块查询算法(JAVA)相关推荐
- 模拟退火算法 java_转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享...
以下文章来源于数据魔术师 ,作者周航 前言 大家好呀!我们你们好久不见的...咳咳,初次见面的小编! 之前重新整理了ILS的代码,有人留言问能不能提供java版. 正好最近在学启发式算法和java,为 ...
- kruskal算法java_克鲁斯卡尔算法(Kruskal)的java实现
下面是我对软件工程教程里面的克鲁斯卡尔算法的实现,发现在网是很少有网友贴出,为了方便大家查询,所以贴出来了,还希望大家能多指点. package Test; import java.io.Buffer ...
- 河内塔算法java_河内递归塔Java
这是我使用递归解决河内塔的Java代码: /**here is a stack of N disks on the first of three poles (call them A, B and C ...
- 大鱼吃小鱼算法java_大鱼吃小鱼-题解(Java代码)
解题思路: 注意事项: 参考代码:import java.util.Arrays; import java.util.Scanner; public class C2322 { public stat ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 21朵水仙花算法java_水仙花数算法 - hi_jyf - OSCHINA - 中文开源技术交流社区
小博在面试中碰到的这个问题,虽然写的比较简单,还是觉得有必要整理一下.当然,如果您有更好的写法,还望不吝赐教. package com.web.demo.algorithm; import java. ...
- shuffle洗牌算法java_洗牌算法shuffle
洗牌算法 1. 背景 阿里的面试的时候做的一道笔试题:题目:写一个方法,入参为自然数n (n > 0),返回一个自然数数组,数组长度为n,元素为[1,n]之间,且每个元素不重复,数组中各元 ...
- 抛硬币仿真实验java_探索HyperLogLog算法(含Java实现)
引言 HyperLogLog算法经常在数据库中被用来统计某一字段的Distinct Value(下文简称DV),比如Redis的HyperLogLog结构,出于好奇探索了一下这个算法的原理,无奈中文资 ...
- hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践
追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...
- 常见排序查询算法Java代码实现
1. 排序算法代码实现 /*** ascending sort* 外层循环边界条件:总共需要冒泡的轮数--每一轮都将最大或最小的数冒泡到最后* 内层循环边界条件:冒泡数字移动的边界--最终数字需冒泡到 ...
最新文章
- iOS开发之抽屉效果实现
- keras从入门到放弃(二十一)LSTM处理 RNN文本分类
- 【福利】爱德华·阿什福德·李:人类与AI技术将是共生关系
- kill -9都杀不掉的进程
- 如何查看所安装的jdk的版本位数
- View Agent Direct-Connection注册表
- pandas.to_numeric
- 【离散数学】集合论 第四章 函数与集合(1) 函数定义、递归定义的函数
- mw150um 驱动程序win10_mercury无线网卡驱动
- wpf-AvalonDock基础-安装和更换主题
- 自然语言处理总复习(七)—— 概率上下文无关文法
- 斗地主发牌游戏编程java,自己做的斗地主游戏发牌C#程序
- BAT自动校对时间脚本,让WINDOWS系统自动校对时间
- 互联网金融牌照有哪些 金融牌照一览表
- GPS警用车辆3G视频监控系统方案
- 《全球概览》:嬉皮士生存指南
- 动态规划表格法解决最长公共子序列(LCS)问题
- 意念云分发是干嘛的?
- BIOS基础 - 什么是BIOS
- 北京内推 | 智源人工智能研究院招聘视觉模型算法工程师/实习生