算法基础篇-03-查找(顺序查找和二分法查找)

news2024/11/15 14:03:42

1.查找

  • 查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程;
  • 列表查找(线性表查找):从列表中查找指定元素;
    • 输入: 列表,待查找元素
    • 输出:元素下标(未找到元素时一般返回None或-1)
  • 内置列表查找函数:index of ()

2. 顺序查找(Linear Search)

顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 线性查找/顺序查找
 *
 * @author wql
 * @date 2022/12/7 21:44
 */
public class LinearSearch {
    public static void main(String[] args) {
        List<String> asList = Arrays.asList("A", "AB", "AC");
        int index = handLinearSearch(asList, "AC");
        System.out.println("index = " + index);
    }
    
    /**
     * 顺序查找(线性查找)
     *
     * @param arr         待查找列表
     * @param targetValue 目标值
     * @return 目标值所处位置索引下标
     */
    public static int handLinearSearch(List<String> arr, String targetValue) {
        for (int i = 0; i < arr.size(); i++) {
            if (Objects.equals(targetValue, arr.get(i))) {
                return i;
            }
        }
        return -1;
    }
}

在这里插入图片描述
如上图所示:分析算法时间复杂度三部曲:寻找规模n,是否存在循环减半过程,k层关于n的循环;从代码中,我们可以看出不存在循环减半和k层n循环的过程,问题规模是n,那么这个顺序查找的
时间复杂度为: O(n)

3. 二分查找(Binary Search)

二分查找:又叫折半查找,从有序列表的初始候选区li[0:n] 开始,通过对待查找的值与候选区中间值的比较,可以是候选区减少一半;

案例:
在这里插入图片描述
我们要从列表里面寻找3的位置,问题规模是n,目标值是3,那么在使用二分查找的时候,我们的关键是如何为维护候选区,候选区指的是目标值所在区域;假设初始的时候left是0,right是n-1,其实就是下标;
那么我们求中间值就是left + right 之和,再除以2,也就是mid;

如上图所示,第一步中间值是5,5大于3,则要维护候选区,就是将right指针移动到mid-1的位置,如下图所示
在这里插入图片描述
第二步:重新计算新的mid下标,此时0+3 除以2 等于1,那么mid光标在 2上面
在这里插入图片描述
再比较2和3,发现2比3小,所以移动left,left的下一个位置等于mid位置+1
在这里插入图片描述
第三步:left=2,right=3,那么2+3=5,除以2,等于2,所以mid等于left,也就是3上面
在这里插入图片描述
最后一步:判断当mid值等于3时,输出mid值,也就是3的下标,如果left 大于right ,那么候选区没有值了,也就是找不到,返回-1

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 二分查找
 *
 * @author wql
 * @date 2022/12/7 22:01
 */
public class BinarySearch {

    public static void main(String[] args) {
        List<Integer> asList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        int index = handBinarySearch(asList, 3);
        System.out.println("index = " + index);
    }

    /**
     * 二分查找
     * <p>
     * 列表首先默认时排好序的
     *
     * @param arr         待查找列表
     * @param targetValue 目标值
     * @return 目标值所处位置索引下标
     */
    public static int handBinarySearch(List<Integer> arr, Integer targetValue) {
        //定义left right mid
        int left = 0;
        int right = arr.size() - 1;
        //当left<=right时,表示候选区有值
        while (left <= right) {
            //获取中间值的下标
            int mid = (left + right) / 2;
            if (Objects.equals(targetValue, arr.get(mid))) {
                return mid;
            } else if (arr.get(mid) > targetValue) {
                //如果中间值大于目标值,说明候选区在左侧
                right = mid - 1;
            } else if (arr.get(mid) < targetValue) {
                //如果中间值小于目标值,说明候选区在右侧
                left = mid + 1;
            }
        }
        return -1;
    }
}

在这里插入图片描述
时间复杂度:O(logn)

4. 顺序查找和二分查找对比

二分查找效率远远大于 线性查找,那为啥jdk里面的 index of 函数不使用二分查找,因为使用二分查找的前提是列表必须是有序的;所以在不能保证列表有序的情况下,使用线性查找;因为排序也可能消耗大量的时间;

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

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

相关文章

【Linux】git的使用

&#x1f922;Linux 关联到gitee的操作记录 &#x1f922;Linux 下下载gitee的库 &#x1f92c;sudo yum install git 在Linux中安装git这个软件 &#x1f92c;git clone 下载gitee库到本地 &#x1f92c;git add. 将代码放到刚才下载好的目录中 &#x1f92c;git commit -…

HTML网上书店静态HTML网页作业作品 大学生三联书店网页设计制作成品 简单DIV CSS布局网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringBoot 如何进行业务校验,老鸟们都这么玩的~

throw new IllegalArgumentException(“用户不存在&#xff01;”); } } 采用Assert能使代码更优雅&#xff0c;更简洁。 还是上面的例子&#xff0c;如果采用Assert可以这样写&#xff1a; public void test2(int accountId) { Account account accountDao.selectById(…

【力扣篇一】数组30题

前言 &#xff08;12月5日&#xff09;突然想起了很久以前别人&#xff08;具体来源已经记不清了&#xff09;传给我的一套题单。网上的题单不少&#xff0c;光收藏可不行&#xff0c;关键还得下手。 这套题单的题目数量为300出头&#xff0c;什么时候刷完我还没有明确计划&a…

对标40亿美金Webflow,「Towify」想用无代码方式搭建小程序

低代码和无代码的浪潮,在全球已经席卷了几次。今年以来,以低代码、无代码方式为主的网页开发、搭建工具受到了资本和市场的认可: 2022年8月,成立于2017年的低代码-内部程序开发平台Retool完成4500万美元融资,投后估值32亿美元。2022年3月,成立于2012年的无代码-外部网页搭…

关于魔趣刷机(含root)步骤

关于魔趣刷机&#xff08;含root&#xff09;步骤准备工作第一步&#xff1a;下载room和TWRP第二步&#xff1a;刷入TWRP到手机第三步&#xff1a;刷入room到手机第四步&#xff1a;安装Magisk app第四步&#xff1a;验证手机是否root参考链接准备工作 一台手机(推荐小米)、TW…

ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了通过文件系统读取 SD 卡上的文件&#xff0c;并对文件和文件夹做读、写、删除、建立、文件列表、文件搜索等功能&#xff0c…

【Pytorch】第 8 章 :实施政策梯度和政策优化

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Git 客户端::Git Fork 注册版-NEW

Git Fork 是最简单有效的 Windows 客户端之一。许多开发人员正在使用此版本控制程序&#xff0c;它允许您协作处理您的项目。具有类似这样的用户界面的客户端可以使您的工作更轻松。 Fork 的 Fork 界面非常人性化。在右侧的左侧有大量的存储库和分支、标签、来源和藏匿处。此外…

【Pytorch】第 7 章 :深度 Q 网络实战

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

CleanMyMac X4.12.2免费版MAC电脑系统磁盘优化工具

我的 MacBook Pro 只有 256GB 硬盘空间&#xff0c;平时也勉强够用。但最近在升级新版本操作系统 macOS Ventura 13 时发现磁盘空间不够&#xff0c;导致不能升级。对于一个升级强迫症患者来说&#xff0c;任何的小红点都不能忍&#xff0c;更何况是系统升级这种事情。在确定了…

ARM 汇编初始化 SDRAM 详解

一、初始化代码框架介绍&#xff08;函数调用和返回、步骤等&#xff09; SDRAM 初始化使用一个函数 sdram_asm_init &#xff0c;函数在 sdram_init.S 文件中实现&#xff0c;是一个汇编函数。 强调&#xff1a;汇编实现的函数在返回时需要明确使用返回指令&#xff08;mov p…

1561_AURIX_TC275_电源管理以及监控

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 从这个拓扑图中可以看的出来&#xff0c;AD相关部分的供电以及参考电压都是独立的&#xff0c;而且是来自于外部的。 1. LDO相关的模块有EVR33和EVR13. 2. 1.3V的供电之前只知道是一个内核…

win11:clion + cmake + mingw + glfw

clion & cmake 官网下载安装即可 clion的设置 mingw 链接 版本如下&#xff1a; windows系统只考虑选择x86_64-win32-sjlj和x86_64-win32-seh&#xff0c;区别&#xff1a; sjlj支持32位和64位seh只支持64位&#xff0c;比较新 glfw 官网提供下载&#xff1a;源码、…

[附源码]JAVA毕业设计学生公寓管理系统(系统+LW)

[附源码]JAVA毕业设计学生公寓管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

蜣螂算法(原理)

原文(附文献下载) 1 群体智能优化算法 SI(swarm intelligence)系统的特点是个体间的相互作用促进了智能行为的出现。 SI优化过程的实现主要包括以下两个步骤&#xff1a; 在搜索空间范围内创建一组随机个体在迭代过程中组合、移动或进化这些随机个体。 每种优化算法的区别…

基于java+springmvc+mybatis+jsp+mysql的校园办公室报修管理系统

项目介绍 校园办公室报修管理系统&#xff0c;是基于java编程语言&#xff0c;ssm框架&#xff0c;jsp技术&#xff0c;mysql数据库开发&#xff0c;本系统主要分为用户&#xff0c;教师&#xff0c;管理员&#xff0c;维修员四个角色&#xff0c;其中用户的功能是注册和登陆系…

【多尺度融合:基于深度学习:压缩图像伪像:blocking artifact】

Deep learning-based compressed image artifacts reduction based onmulti-scale image fusion &#xff08;基于多尺度图像融合的基于深度学习的压缩图像伪影减少&#xff09; 在基于块的图像/视频压缩平台中&#xff0c;视觉上明显的压缩伪像之一称为blocking artifact&…

CubeIDE新建工程

使用CubeIDE新建工程 开发流程如图&#xff08;图片来源于b站教程&#xff09;&#xff1a; 1、新建工程 打开CubeIDE&#xff0c;选择文件>新建>STM32Project 软件自己会下载hal库&#xff0c;首次下载可能会有些慢&#xff0c;请耐心等待。 下载完成后&#xff0c;自…

基于java+springmvc+mybatis+jsp+mysql的个人所得税服务系统

项目介绍 随着居民的收入不断提高&#xff0c;个人都需要缴纳一定比例的个人所得税&#xff0c;传统的方式是去税务大厅人工缴纳&#xff0c;为了解决这种人工交税的方式&#xff0c;特此开发了一个在线交税的网站&#xff0c;本系统采用java语言开发&#xff0c;后端采用ssm框…