分块查找【数字无规律】

对于无序且无规律的数据,分块思想可以转变成,要使用每一块的数据范围不能有交集的思想

public class BlockSearchDemo2 {
    public static void main(String[] args) {
         /*
            分块查找[无规律的数据]
            核心思想:
                块内无序,块间无序
            实现步骤:
                1.创建数组blockArr存放每一个块对象的信息
                2.先查找blockArr确定要查找的数据属于哪一块
                3.再单独遍历这一块数据即可
        */
        int[] arr = {27, 22, 30, 40,
                36, 13, 19, 16, 20,
                7, 10,
                43, 50, 48};
        Block1 b1 = new Block1(22, 40, 0, 3);
        Block1 b2 = new Block1(13, 36, 4, 8);
        Block1 b3 = new Block1(7, 10, 9, 10);
        Block1 b4 = new Block1(43, 50, 11, 13);
        //定义数组用来管理四个块的对象(索引表)
        Block1[] blockArr1 = {b1, b2, b3, b4};

        //定义一个变量用来记录要查找的元素
        int number = 48;

        //调用方法,传递索引表,数组,要查找的元素
        int index = getIndex(arr, blockArr1, number);

        //打印一下
        System.out.println(index);

    }

    private static int getIndex(int[] arr, Block1[] blockArr1, int number) {
        //1.确定number是在那一块当中
        int indexBlock = findIndexBlock(blockArr1, number);

        if (indexBlock == -1) {
            //表示number不在数组当中
            return -1;
        }

        //2.获取这一块的起始索引和结束索引   --- 30
        // Block b1 = new Block(21,0,5);   ----  0
        // Block b2 = new Block(45,6,11);  ----  1
        // Block b3 = new Block(73,12,17); ----  2
        int startIndex = blockArr1[indexBlock].getStartIndex();
        int endIndex = blockArr1[indexBlock].getEndIndex();

        //3.遍历
        for (int i = startIndex; i <= endIndex; i++) {
            if (arr[i] == number) {
                return i;
            }
        }
        return -1;
    }
    //定义一个方法,用来确定number在哪一块当中
    public static int findIndexBlock(Block1[] blockArr1, int number) { //100


        //从0索引开始遍历blockArr,如果number小于max,那么就表示number是在这一块当中的
        for (int i = 0; i < blockArr1.length; i++) {
            if (number <= blockArr1[i].getMax()) {
                return i;
            }
        }
        return -1;
    }


}

class Block1 {
    private int min; //最小值
    private int max;//最大值
    private int startIndex;//起始索引
    private int endIndex;//结束索引


    public Block1() {
    }

    public Block1(int min, int max, int startIndex, int endIndex) {
        this.min = min;
        this.max = max;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    /**
     * 获取
     *
     * @return min
     */
    public int getMin() {
        return min;
    }

    /**
     * 设置
     *
     * @param min
     */
    public void setMin(int min) {
        this.min = min;
    }

    /**
     * 获取
     *
     * @return max
     */
    public int getMax() {
        return max;
    }

    /**
     * 设置
     *
     * @param max
     */
    public void setMax(int max) {
        this.max = max;
    }

    /**
     * 获取
     *
     * @return startIndex
     */
    public int getStartIndex() {
        return startIndex;
    }

    /**
     * 设置
     *
     * @param startIndex
     */
    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    /**
     * 获取
     *
     * @return endIndex
     */
    public int getEndIndex() {
        return endIndex;
    }

    /**
     * 设置
     *
     * @param endIndex
     */
    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }

    public String toString() {
        return "Block1{min = " + min + ", max = " + max + ", startIndex = " + startIndex + ", endIndex = " + endIndex + "}";
    }
}

运行结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分块查找是一种基于分思想的查找算法,它将一个大的数据集合分成若干,每一中的数据元素可以是无序的,但之间必须是有序的。分块查找的平均查找长度取决于内元素个数和的个数,具体计算公式如下: 平均查找长度 = (内元素个数 + 的个数) / 2 其中,内元素个数和的个数可以通过实际问题中的数据集合和的大小来确定。 下面是一个示例代码,演示如何实现分块查找并计算平均查找长度: ```python import math def block_search(arr, block_size, target): # 将数据集合分 blocks = [arr[i:i+block_size] for i in range(0, len(arr), block_size)] # 计算的个数 num_blocks = len(blocks) # 遍历每个,查找目标元素所在的 for i in range(num_blocks): if target in blocks[i]: # 如果目标元素在当前中,返回目标元素在中的位置 return i, blocks[i].index(target) # 如果目标元素不在任何一个中,返回-1 return -1, -1 # 示例数据集合 arr = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10] # 的大小 block_size = 3 # 目标元素 target = 6 # 分块查找 block_index, index_in_block = block_search(arr, block_size, target) if block_index == -1: print("目标元素不在数据集合中") else: # 计算平均查找长度 avg_len = (index_in_block + block_index + 1) / 2 print("目标元素在第%d个中,内位置为%d,平均查找长度为%.2f" % (block_index+1, index_in_block+1, avg_len)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值