查找-分块查找

参考:https://www.cnblogs.com/yw09041432/p/5908444.html

源码:https://github.com/sunrui849/selectAlgorithm

目录:顺序查找

二分查找

插值查找

斐波那契查找

分块查找

哈希查找

二叉树查找

红黑树查找

查找-分块查找

 分块查找又称索引顺序查找,它是顺序查找的一种改进方法,要求按块有序,块内无序。
  算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
  算法流程:
  step1 先选取各块中的最大关键字构成一个索引表;
  step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。

      代码实现:


/**
 * 分块查找
 */
public class BlockSelect {
    private static class Block{
        private int maxValue;
        private List<Integer> list = new ArrayList<Integer>();

        public int getMaxValue() {
            return maxValue;
        }

        public void setMaxValue(int maxValue) {
            this.maxValue = maxValue;
        }

        public List<Integer> getList() {
            return list;
        }

        public void setList(List<Integer> list) {
            this.list = list;
        }

        @Override
        public String toString() {
            return "{块最大值:" + maxValue + ";块内集合:" + list.toString() + "}";
        }
    }

    public static void main(String[] args) {
        //构建符合要求的块,按块有序,块内无序
        List<Block> list = new ArrayList<Block>();
        for (int i = 0;i < 10;i++){
            Block block = new Block();
            block.setMaxValue((i+1)*5-1);
            List<Integer> list1 = new ArrayList<Integer>();
            list1.add(i*5);list1.add(i*5+2);
            list1.add(i*5+1);list1.add(i*5+4);
            list1.add(i*5+3);
            block.setList(list1);
            list.add(block);
        }
        System.out.println(list);
        selectFromBlock(list,12);
    }

    /**
     * 块集合从小到大
     * 在查找块的时候和块内查找的时候均使用的为顺序查找,可更改查找算法
     * @param list
     * @param selectValue
     */
    public static void selectFromBlock(List<Block> list,int selectValue){
        int blockIndex = -1;
        for (int i = 0;i < list.size(); i++){
            if (selectValue < list.get(i).getMaxValue()){
                blockIndex = i;
                System.out.println("查找的值可能在块 " + i + " 中");
                break;
            }
        }

        if (blockIndex < 0){
            System.out.println("块集合中不存在要查找的值!");
            return;
        }

        List<Integer> blockList = list.get(blockIndex).getList();
        for (int i = 0;i < blockList.size(); i++){
            if (blockList.get(i) == selectValue){
                System.out.println("结果:查找的值在块 " + blockIndex + " 中下标为:" + i);
                return;
            }
        }
        System.out.println("结果:查找的值不存在!");
    }


}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值