JAVA算法(一)查找算法

news2024/12/21 16:54:25

一、基本查找 / 顺序查找

核心:从0索引开始挨个往后查找

	private static boolean basicSearch(int[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }

二、二分查找 / 折半查找

前提:数组中的数据必须是有序的
核心:每次排除一半的查找范围
优势:提高查找效率

在这里插入图片描述

  1. min和max表示当前要查找的范围
  2. mid是在min和max中间的
  3. 如果要查找的元素在mid的左边,缩小范围时,min不变,max等于mid减1
  4. 如果要查找的元素在mid的右边,缩小范围时,max不变,min等于mid加1
    private static int search(int[] arr, int number) {
        // 记录查找的最小值和最大值
        int min = 0;
        int max = arr.length - 1;

        while (true) {
            // 判断最小值大于最大值,不存在
            if (min > max) {
                return -1;
            }
            // 找到中间位置
            int mid = (min + max) / 2 ;
            // 拿中间位置的值和number比较
            if (arr[mid] > number) {
                // number在mid的左边,最小值min不变,最大值max=mid-1
                max = mid - 1;
            } else if (arr[mid] < number) {
                // number在mid的右边,最大值max不变,最小值min=mid+1
                min = mid + 1;
            } else {
                // 相等,找到数据,返回下标
                return mid;
            }
        }
    }

三、插值查找

前提:有序序列,并且元素呈现均匀分布
在这里插入图片描述

    public static int interpolation_search(int[] arr, int begin, int end, int ele) {
        // 如果[begin,end] 不存在,返回 -1
        if (begin > end) {
            return -1;
        }
        //如果搜索区域内只有一个元素,判断其是否为目标元素
        if (begin == end) {
            if (ele == arr[begin]) {
                return begin;
            }
            //如果该元素非目标元素,则查找失败
            return -1;
        }
        // 找到中间元素所在的位置
        int mid = begin + ((ele - arr[begin]) / (arr[end] - arr[begin]) * (end - begin));
        // 递归的出口
        if (ele == arr[mid]) {
            return mid;
        }
        // 比较 ele 和 arr[mid] 的值,缩小 ele 可能存在的区域
        if (ele < arr[mid]) {
            // 新的搜索区域为 [begin,mid-1]
            return interpolation_search(arr, begin, mid - 1, ele);
        } else {
            // 新的搜索区域为 [mid+1,end]
            return interpolation_search(arr, mid + 1, end, ele);
        }
    }

四、斐波那契查找

在这里插入图片描述

五、分块查找

分块原则1:前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序)
分块原则2:块数一般是长度开根号
核心思路: 先确定查找的元素在哪一块,然后在块内挨个查找
在这里插入图片描述

public class BlockSearch {
    public static void main(String[] args) {

        //定义原始数组,并分块
        int[] arr = {16,4,19,12,21,18,32,23,37,26,45,34,50,48,61,62,73,76};
        //创建三个块对象
        Block b1 = new Block(21,0,5);
        Block b2 = new Block(45,6,11);
        Block b3 = new Block(76,12,17);
        //创建索引表
        Block[] blockArr = {b1,b2,b3};
        //定义要查找的元素
        int number = 26;
        //调用方法求Index
        int Index = getIndex(blockArr,arr,number);
        System.out.println(Index);
    }

    //查询number的索引值
    private static int getIndex(Block[] blockArr, int[] arr, int number) {
    	int Indexblock = -1;
        for (int i = 0; i < blockArr.length; i++) {
            if(number <= blockArr[i].getMax()){
                Indexblock = i;
                break;
            }
        }
        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;
    }

}

六、哈希查找

七、树表查找

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

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

相关文章

(四) 打造更加智能的即时通信系统——实现主界面消息和联系人切换效果

文章目录 一、引言二、界面设计的基本要求2.1 界面美观简洁2.2 功能合理布局 三、界面布局和控件设计四、效果展示五、关键代码六、个人经验分享6.1 即时通信系统开发中的经验和总结6.2 遇到的问题和解决方案6.3优化即时通信系统 七、总结 一、引言 当今社会&#xff0c;人们对…

解决 scalac: bad option: ‘-make:transitive‘

scalac: bad option: ‘-make:transitive’ 打开项目所在位置并进入 .idea 修改scala_compiler.xml文件 删除掉参数行包含-make:transitive 保存后 重新运行代码

Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130533941 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

uniapp云打包

1. 生成本地打包资源 2. 下载Android Studio和App离线SDK 导航路径&#xff1a;https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android 下载的Android 离线SDK与本地开发工具版本对应 3. 解压得到的目录如下 4. 使用Android Studio打开Android 离线SDK解压目录里面这个…

计算机毕业论文选题推荐|软件工程|系列一

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)的研发部署管理…

全方位揭秘!大数据从0到1的完美落地之MapReduce实战案例(1)

案例一: MR实战之小文件合并(自定义inputFormat) 项目准备 需求 无论hdfs还是MapReduce&#xff0c;对于小文件都有损效率&#xff0c;实践中&#xff0c;又难免面临处理大量小文件的场景&#xff0c;此时&#xff0c;就需要有相应解决方案 测试数据 分析 小文件的优化无…

ClickHouse:联接执行的内部机制

在之前的文章中&#xff0c;我们回顾了 ClickHouse 中可用的 SQL JOIN 类型。提醒一下&#xff1a;ClickHouse 附带完整的 SQL 连接支持。 在本文中&#xff0c;我们将探索 ClickHouse 中联接执行的内部结构&#xff0c;以便您可以优化应用程序使用的查询的联接。在这里&#…

数据集进行拆分到底什么样数据算是数据标签什么样的数据算数据样本

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 忽闻海上有仙山&#xff0c;山在虚无缥缈间。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【kim】问了一个Python机器学习的问题&…

【AI大模型】SparkDesk讯飞星火认知大模型初体验-国内最强ChatGPT

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后 前言 5月6日&#xff0c;讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型&#xff0c;现场实测大…

5. 类和对象

一、面向对象程序设计的基本特点 1.1 抽象 指对具体问题&#xff08;对象&#xff09;进行概括&#xff0c;抽出一类对象的公共性质并加以描述的过程 数据抽象 描述某类对象的属性或状态&#xff0c;即此类对象与其他类对象的区别 行为抽象 描述某类对象的共同行为或功能特征…

计算机毕业论文内容参考|基于神经网络的网络安全态势感知技术研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 基于神经网络的网络安全态势感知技术研究 文章重点 摘要 随着互联网的快速发展,网络攻击的频率和复杂度也在逐年增加。为了更好地保护信息系统…

Java版本spring cloud 工程管理系统软件 系统源代码 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

项目终于用上了 DDD 领域驱动,太强了

在公司对支付业务、结算业务、资金业务使用DDD进行领域建模的两年&#xff0c;得到了许多好评&#xff0c;也面对过不少质疑&#xff0c;总体来说还是能收获不少&#xff0c;这对团队成员理解业务起着很大作用。近半年一直在研究DDD的落地实战&#xff0c;如今已修得阶段性成果…

让ChatGPT来制作Excel表格,ChatGPT实现文本和表格的相互转换

Office 三套件可以说是现代办公族必备的办公工具。其中&#xff0c;Excel 因为内置的计算函数、VBA 宏等高级功能又成为了非专业人士最头疼的 Office 组件。非财务专业人士&#xff0c;估计平常会用的 Excel 函数仅限于 SUM(), AVERAGE() 等&#xff0c;甚至这些都是通过界面点…

【2023 · CANN训练营第一季】应用开发深入讲解——第三章应用调试

学习资源 日志参考文档 应用开发FAQ 日志主要用于记录系统的运行过程及异常信息&#xff0c;帮助快速定位系统运行过程中出现的问题以及开发过程中的程序调试问题。 日志分为如下两大类&#xff1a; 系统类日志&#xff1a;系统运行产生的日志。主要包括&#xff1a; Contro…

shiro CVE-2016-4437 漏洞复现

shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序漏洞原理 在Apache shiro的框架中&#xff0c;执行身份验证时提供了…

【开发者必读】如何在MyEclipse中使用内联搜索?

MyEclipse v2022.1.0正式版下载 DevStyle中的内联搜索取代了传统的Eclipse查找和替换对话框&#xff0c;提供了一种更加高效和非侵入性的搜索体验——一种不会中断您的开发工作流程的工具。 DevStyle是一个Eclipse插件&#xff0c;也包含在MyEclipse中。 选择内联搜索参数 …

C++编译器对于对象的优化

C编译器对于对象构造的优化 用临时对象生成新对象时&#xff0c; 临时对象就不产生了&#xff0c;直接构造新对象即可 class Test { public:Test(int a 10) :ma(a){cout << "Test(int)" << endl;}~Test(){cout << "~Test()" <<…

node中npm依赖安装顺序,package-lock.json文件详解

前置知识&#xff1a;需要先了解package.json 和package-lock.json的基本知识和使用方法&#xff0c;可以参考这篇文章。 npm依赖安装的逻辑和顺序可以参考这篇文章 理论看完了我们来看一下实际项目中的是啥样的&#xff0c;上面文章所讲的逻辑都会在npm install之后&#xf…

程序员面试金典16.*

文章目录 16.01 交换数字16.02单词频率16.03交点16.04 井字游戏16.05 阶乘尾数16.06 最小差16.07 最大数值16.08 整数的英文表示16.09 运算16.10 生存人数16.11 跳水板16.13 平分正方形16.14 最佳直线&#xff08;待定&#xff09;16.15珠玑妙算16.16部分排序16.17连续数列16.1…