查找算法之分块查找

news2025/1/16 9:15:00

目录

  • 前言
  • 一、查找算法预备知识
  • 二、分块查找
  • 三、总结
    • 3.1 查找性能
    • 3.2 适用场景
    • 3.3 优缺点


前言

查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中,查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。
查找算法的目标是在尽可能短的时间内找到目标元素,以提高程序的效率和性能。常见的查找算法包括但不限于二分查找、哈希表查找、线性查找、二叉查找树等。

一、查找算法预备知识

查找算法分类

1)静态查找和动态查找;
注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
2)无序查找和有序查找。
无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。

平均查找长度(Average Search Length,ASL)
需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。

Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。

二、分块查找

分块查找(Blocking Search)又称为索引顺序查找法,在此查找法中,除了原表本身以外还需要建立一个“索引表”,即将原表分成一块一块,每一块选取其最大的记录作为关键字项,块中的起始下标为块的指针项。索引表按照关键字有序,即块与块之间有序,块内元素无序。查找时先确定待查找的记录在哪一块,再在具体某个块内使用顺序查找法查找其具体位置。故其性能介于顺序查找法和折半查找法之间。

算法步骤

  • 首先确定待查记录所在的块(子表)
  • 然后在块中进行顺序查找确定记录的最终位置
public class BlockSearch {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        //原表
        int a[] = {9, 22, 12, 14, 35, 42, 44, 38, 48, 60, 58, 47, 78, 80, 77, 82};
        //分块获得对应的索引表,这里是一个以索引结点为元素的对象数组
        BlockTable[] arr = {
                new BlockTable(22, 0, 3),//最大关键字为22 起始下标为0,3的块
                new BlockTable(44, 4, 7),
                new BlockTable(60, 8, 11),
                new BlockTable(82, 12, 15)
        };
        //打印原表
        System.out.print("原表元素如下:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
        //待查关键字
        while (true) {
            System.out.print("请输入你所要查询的关键字:");
            int key = input.nextInt();
            //调用分块查找算法,并输出查找的结果
            int result = BlockSearch(a, arr, key);
            System.out.print("查询结果为:" + result);
            System.out.println();
        }
    }

    private static int BlockSearch(int a[], BlockTable[] arr, int key) {
        int left = 0, right = arr.length - 1;
        //利用折半查找法查找元素所在的块
        while (left <= right) {
            int mid = (left + right) >>> 1;
            if (arr[mid].key >= key) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        //循环结束,元素所在的块为right+1 取对应左区间下标作为循环的开始点
        int i = arr[right + 1].low;
        //在块内进行顺序查找确定记录的最终位置
        while (i <= arr[right + 1].high && a[i] != key) {
            i++;
        }
        //如果下标在块的范围之内,说明查找成功,佛否则失败
        if (i <= arr[right + 1].high) {
            return i;
        } else {
            return -1;
        }
    }
}

//索引表结点
class BlockTable {
    int key;
    int low;
    int high;

    BlockTable(int key, int low, int high) {
        this.key = key;
        this.low = low;
        this.high = high;
    }
}

在这里插入图片描述

三、总结

3.1 查找性能

时间、空间复杂度均不超过O(n)

3.2 适用场景

适用于静态查找表:即查找表不经常发生变化,适合建立分块索引。
适用于有序表:由于分块查找是基于有序表的,因此适用于有序表的查找。
数据量较大:当数据量较大时,分块查找可以将数据分块处理,提高查找效率。
查找频繁:如果需要频繁进行查找操作,分块查找可以提供较快的查找速度。

总的来说,分块查找结合了顺序查找和折半查找的优点,适用于静态、有序、数据量大且需要频繁查找的情况。它能够有效地减少查找时间,提高查找效率。

3.3 优缺点

优点:

在表中插入和删除元素时,只需要找到对应的块,就可以在块内进行插入和删除运算
块内无序,插入和删除都较为容易,无需进行大量移动
适合线性表既要快速查找又要经常动态变化的场景

缺点:

需要增加一个存储索引表的内存空间
需要对初始索引表按照其最大关键字(或最小关键字)进行排序运算

参考链接:
Java基本查找算法–分块查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

家用洗地机哪款好用?盘点618值得买的洗地机品牌

对于工作忙碌或家里养了宠物的很多朋友来说&#xff0c;洗地机它集合吸尘清扫湿拖的功能&#xff0c;很大程度上解放了家庭清洁劳动的繁琐&#xff0c;让人们腾出更多的时间休息&#xff0c;那么&#xff0c;市场上有很多牌子的洗地机&#xff0c;价格也各不相同&#xff0c;那…

HarmonyOS应用性能分析工具CPU Profiler的使用指南

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

前言 泛型是一种编程概念&#xff0c;它允许我们编写可以适用于多种数据类型的代码。通过使用泛型&#xff0c;我们可以在编译时期将具体的数据类型作为参数传递给代码&#xff0c;从而实现代码的复用和灵活性。 在传统的编程中&#xff0c;我们通常需要为不同的数据类型编写不…

web项目运行时,报了500错误(HTTP Status 500 – Internal Server Error)

web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09; 文章目录 web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09;前言一、 解决方法&#xff1a;Project Structure…

视频监控/视频集中存储/云存储EasyCVR视频汇聚平台如何切换主子码流?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

赛氪网凭借教育人优势,荣获中关村高新技术企业协会会员单位称号

2023年&#xff0c;中关村科技园区管理委员会正式公布了一批新的高新技术企业协会会员单位名单&#xff0c;赛氪网荣幸成为其中一员。这一荣誉的获得&#xff0c;不仅是对赛氪网在竞赛、科技创新教育领域的充分肯定&#xff0c;也标志着赛氪网在推动高新技术发展方面迈出了坚实…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

CorelDRAW Graphics Suite 2023最新官网中文版本CDR2022免费激活下载

CorelDRAW Graphics Suite 2023最新中文版本免费激活下载作为一款矢量图形制作工具软件&#xff0c;专门为从事插画设计、广告设计、网页设计、图形编辑等设计行业推出的工具软件。界面也是非常的简洁&#xff0c;能够让用户更快了解其中的各个功能&#xff0c;功能方法一目了然…

增强现实(AR)技术的应用场景

增强现实&#xff08;AR&#xff09;技术将虚拟信息与现实世界融合&#xff0c;为用户提供更加直观、交互式的体验。AR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些AR的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

wireshark RTP分析参数

主要看丢弃和Delta&#xff0c; 丢弃就是丢掉的udp包&#xff0c;所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少&#xff0c;比如G711A&#xff0c;ptime20&#xff0c;那么delta理论上应该趋近于20. 这里的de…

【第18章】spring-resource

文章目录 前言一、Resource1.测试类2.测试结果 二、ResourceLoader1.测试类2.测试结果 三、ResourceLoaderAware1.实现类2.配置文件3.测试类4.测试结果5.结论 总结 前言 在Spring框架中&#xff0c;Resource是一个关键组件&#xff0c;它位于org.springframework.core.io包中&…

HTML使用jQuery实现两个点击按钮,分别控制改文本字体颜色和字体大小

jQuery 简介 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;旨在简化对 HTML 文档的操作、事件处理、动画效果和 AJAX 等操作。 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&q…

【Godot4自学手册】第三十八节给游戏添加音效

今天&#xff0c;我的主要任务就是给游戏添加音效。在添加音效前&#xff0c;我们需要了解一个东西&#xff1a;音频总线。这个东西或许有些枯燥&#xff0c;如果你只为添加一个音效没必要了解太多&#xff0c;但如果你以后将要经常与音频播放打交道&#xff0c;还是要了解一下…

在线测径仪的六类测头组合形式!哪种适合你?

在线测径仪&#xff0c;这一现代工业的精密仪器&#xff0c;犹如一位技艺高超的工匠&#xff0c;以其卓越的性能和精准度&#xff0c;为工业生产提供了坚实的保障。它的出现&#xff0c;不仅提高了生产效率&#xff0c;更保证了产品质量&#xff0c;为企业的可持续发展注入了强…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

怎么在抖音上开店卖货?做好这些,就能轻松赚到辛苦钱!

大家好&#xff0c;我是电商花花。 抖音电商在这几年一直都非常火爆&#xff0c;不少商家和达人都在抖音上赚麻了&#xff0c;这个抖音小店项目在不断的吸引着商家入驻。 说实话&#xff0c;花花就是抖音小店的受益者&#xff0c;让当初啥也不懂的新手小白&#xff0c;到现在…

羊大师解析,夏日消暑羊奶来帮忙

羊大师解析&#xff0c;夏日消暑羊奶来帮忙 炎炎夏日&#xff0c;烈日当空&#xff0c;人们总是寻找各种方式来消暑降温。除了常见的冷饮、空调等&#xff0c;其实还有一种天然、健康的饮品可以帮助我们度过酷暑——那就是羊奶。 羊奶作为一种营养丰富的天然饮品&#xff0c;不…

【Canvas与艺术】绘制金色八卦图

【关键点】 等比例缩放各部件及将八卦转为“二进制”的过程。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用…