Java查找算法——(四)分块查找(完整详解,附有代码+案例)

分块查找

1.1普通分块查找

分块原则:

  • 块内无序,块间有序:前一块中的最大数据,小于后一块中所有的数据,块与块之间不能有数据重复的交集。
  • 块的数量一般等于数字个数开根号

核心思路:先确定要查找的元素在哪一块,然后再该块内查找。

汲取了顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找

分块查找适用于数据较多,但是数据不会发生变化的情况,如果需要一边添加一边查找,建议使用哈希查找

每块中的最大值有序,如下:

在这里插入图片描述

public class BlockSearchTest {
    public static void main(String[] args) {
  /*分块查找
 核心思想:块内无序,块间有序
 实现步骤:
 1.创建数组blockArr存放每一个块对象的信息
 2.先查找blockArr确定要查找的数据属于哪一块
 3.再单独遍历这一块数据即可*/
        int[] arr = {16, 5, 9, 12,21, 18,
                32, 23, 37, 26, 45, 34,
                50, 48, 61, 52, 73, 66};
        // 创建三个块对象
        Block b1 = new Block(21,0,5);
        Block b2 = new Block(45,6,11);
        Block b3 = new Block(73,12,17);

        // 定义数组管理块对象(索引表)
        Block[] blockArr = {b1,b2,b3};
        //定义变量用来记录查找的元素
        int number = 5;
        // 调用方法,传递索引表、数组、number
        int index = getIndex(blockArr, arr, number);
        //打印number的索引
        System.out.println(index);

    }
    //定义方法:用分块查找原理 查询num的索引
  public static int getIndex(Block[] blockArr,int[] arr,int num){
        // 1.确定num在哪一块中,indexBlack:表示第几块的索引
        int indexBlack = indexFindBlack(blockArr, num);
        if (indexBlack == -1){
            // 表示numme没有在数组中
            return -1;
        }
        //2. 获取这一块块的起始索引和结束索引
      int startIndex = blockArr[indexBlack].getStartIndex();
        int endIndex = blockArr[indexBlack].getEndIndex();
        //3. 遍历
        for (int i = startIndex; i < endIndex; i++) {
            if (arr[i] ==num){
                return i;
            }
        }
        return -1;
    }
  
 // 定义一个方法,确定要找的元素num在哪一块中
public static int indexFindBlack(Block[] blockArr,int num){
   // 从0索引开始遍历blockArr,如果num小于max,就表示num在这一块中
        for (int i = 0; i < blockArr.length; i++) {
            if (num <= blockArr[i].getMax()){
                // 此处i表示第几块,即 块的对象b1 b2 b3
                return i;
            }
        }
        return -1;
    }
}
//创建数组的分块的类
class Block{//块
    private int max;//块中最大值
    private int startIndex;//块内起始索引
    private int endIndex;//块内结束索引
    public Block() {}
    public Block(int max, int starIndex, int endIndex) {
        this.max = max;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }
  
    public int getMax() {return max;}
    public void setMax(int max) {  this.max = max;}
  
    public int getStartIndex() { return startIndex;}
    public void setStarIndex(int startIndex) {
        this.startIndex = startIndex;
    }
    public int getEndIndex() {return endIndex;}
    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值