算法查找——分块查找

简介: 分块查找是折半查找(二分查找)和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序

🟡前言


21天挑战赛第三周,本文将讲述分块查找有关内容


活动地址CSDN21天学习挑战赛


🟡概述


1️⃣定义


分块查找折半查找(二分查找)和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序


2️⃣示意图


0f405e62a88d42b29c62a0a46ac3a5a9.png


3️⃣核心思路


  • 先确定查找元素在哪一块,然后在块内挨个查找( 块内无序,块间有序 )
  • 前一块中最大数据小于后一块中所有数据
  • 块的数量等于数字个数开根号


🟡查找思路


1.创建一个索引表,表中含有每一块的起始索引、终止索引和最大值,并生成一个标准的Javabean


6dfdf8ff54ee448382ef2fc38bd3298f.png

2.查询要查找数字所在的块,并返回块的索引值

3.根据块的索引值查找该块的起始索引和终止索引

4.遍历块,查找数字

5.返回索引值,若无则返回-1


🟡代码实现


public class BlockSearch {
    public static void main(String[] args) {
        //定义原始数组,并分块
        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 = 21;
        //调用方法求Index
        int Index = getIndex(blockArr,arr,number);
        //打印输出Index
        System.out.println(Index);
    }
    //查询number的索引值
    private static int getIndex(Block[] blockArr, int[] arr, int number) {
        int Indexblock = findIndexBlock(blockArr,number);
        if(Indexblock == -1){
            return -1;
        }
        //定义起始索引和终止索引
        int startIndex = blockArr[Indexblock].getStartIndex();
        int endIndex = blockArr[Indexblock].getEndIndex();
        //查找元素对应索引
        for (int i = startIndex; i <= endIndex; i++) {
            if(arr[i] == number){
                return i;
            }
        }
        return -1;
    }
    //查询number索引值所在的块
    private static int findIndexBlock(Block[] blockArr, int number) {
        for (int i = 0; i < blockArr.length; i++) {
            if(number <= blockArr[i].getMax()){
                return i;
            }
        }
        return -1;
    }
}
class Block {
    private int max;
    private int startIndex;
    private int endIndex;
    public Block() {
    }
    public Block(int max, int startIndex, int endIndex) {
        this.max = max;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }
    /**
     * 获取
     * @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;
    }
}

6f2ea4d6a8df48a28dbc901dbbb4419b.png


🟡结语


分块查找仅仅是一种二分查找和顺序查找的改进版本,分块需要人工分,也比较费时

相关文章
|
算法 容器
算法:双指针解决数组划分和数组分块问题
算法:双指针解决数组划分和数组分块问题
|
5月前
|
存储 机器学习/深度学习 算法
python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】
python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】
|
算法
java202303java学习笔记第二十九天常见算法1分块
java202303java学习笔记第二十九天常见算法1分块
70 0
|
存储 机器学习/深度学习 人工智能
秒懂算法 | 分块算法
本篇内容包括了分块算法的思想的介绍、分块算法复杂度的分析以及相关例题。
347 0
秒懂算法 | 分块算法
|
算法 索引
数据结构上机实践第14周项目1(2) - 验证算法(分块查找)
数据结构上机实践第14周项目1(2) - 验证算法(分块查找)
数据结构上机实践第14周项目1(2) - 验证算法(分块查找)
|
算法
算法查找——二分查找
算法查找——二分查找
91 0
算法查找——二分查找
|
算法 语音技术 Python
Python算法:Brute-Force算法查找字符串子串位置
Python算法:Brute-Force算法查找字符串子串位置
103 0
Python算法:Brute-Force算法查找字符串子串位置
|
存储 算法 索引
【数据结构和算法】线性表的查找算法(顺序查找,二分查找,插值查找,分块查找)
【数据结构和算法】线性表的查找算法(顺序查找,二分查找,插值查找,分块查找)
319 0
【数据结构和算法】线性表的查找算法(顺序查找,二分查找,插值查找,分块查找)
|
存储 算法
数据结构 查找 静态查找表算法 折半查找 二叉排序树查找算法 实验报告
数据结构 查找 静态查找表算法 折半查找 二叉排序树查找算法 实验报告
121 0
数据结构 查找 静态查找表算法 折半查找 二叉排序树查找算法 实验报告
|
算法
实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)
实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)
492 0
实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)