【算法】常用查找算法(顺序查找、二分查找、插值查找、斐波那契查找)

news2025/3/12 13:27:06

目录

  • 查找算法
    • 1.线性(顺序)查找
      • (1)思路
      • (2)代码实现(java)
    • 2.二分(折半)查找
      • (1)思路
      • (2)代码实现(java)
    • 3.插值查找
      • (1)思路
      • (2)代码实现(java)
    • 4.斐波那契(黄金分割法)查找
      • (1)思路
      • (2)代码实现(java)

查找算法

1.线性(顺序)查找

(1)思路

判断序列中是否包含某个元素,找到提示并输出下标值
初始数组:{13,4,88,28,6},找到88这个值的下标。

(2)代码实现(java)

/**
 * 顺序(线性)查找
 * author:xinxin
 */
public class SeqSearch {
    public static void main(String[] args) {
        int[] arr = {13,4,88,28,6};
        int result = seqSearch(arr,88);
        System.out.println("下标为:"+result);
    }

    /**
     * @param arr  无序序列
     * @param value 需要找的值
     * @return
     */
    public static int seqSearch(int[] arr,int value){
        //线性查找,逐一对比,发现相同值,返回下标
        for (int i = 0; i < arr.length ; i++) {
            if (arr[i] == value){
                return i; //返回下标
            }
        }
        return -1;
    }
}

2.二分(折半)查找

(1)思路

注意:二分查找的前提是序列是有序的。
初始数组:{1,2,3,4,5,6,7,8,9},查找3这个值,并输出下标,没有就提示

在这里插入图片描述

(2)代码实现(java)

/**
 * 二分查找
 * author:xinxin
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        List<Integer> resValList = binarySearch(arr, 0, arr.length - 1, 3);
        System.out.println("要找的值下标为:"+resValList);
    }

    /**
     * @param arr    初始数组
     * @param left   左索引
     * @param right  右索引
     * @param value  要找的值
     * @return
     */
    public static List<Integer> binarySearch(int[] arr, int left, int right, int value){
        //没找到值
        if (left > right){
            return new ArrayList<Integer>();
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];
        //向右递归
        if (midVal < value){
            return binarySearch(arr,mid+1,right,value);
        }else if (midVal > value){//向左递归
            return binarySearch(arr,left,mid-1,value);
        }else{//正好找到了(包含出现多个相同的值)
            ArrayList<Integer> resValList = new ArrayList<>();
            //向左扫描,看看是否存在相同的值
            int temp = mid - 1;
            while(true){
                if (mid < 0 || arr[temp] != value){//退出
                    break;
                }
                resValList.add(temp);
                temp = temp - 1;//左移
            }

            //向右扫描,看看是否存在相同的值
            temp = mid + 1;
            while(true){
                if (mid > arr.length-1 || arr[temp] != value){//退出
                    break;
                }
                resValList.add(temp);
                temp = temp + 1;//右移
            }
            resValList.add(mid);
            return resValList;
        }
    }
}

3.插值查找

(1)思路

插值查找类似于二分查找,不同的是每次都是mid处查找,对于数据量比较大,分布比较均匀,适合用插值查找。
公式:mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]) //left代表左索引,right代表右索引,value就是要查找的值
初始数组:[1,2,3…100]
找值 1 , mid = 0 + (99 - 0) * (1 - 1) / (100 - 1) = 0
找值100,mid= 0 + (99 - 0)*(100 - 1)/(100 - 1) = 99

(2)代码实现(java)

/**
 * 插值查找
 * author:xinxin
 */
public class InsertSearch {
    public static void main(String[] args) {
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
        int index = insertSearch(arr,0,arr.length-1,23);
        System.out.println("下标为:"+index);
    }

    public static int insertSearch(int[] arr,int left,int right,int value){
        //要找的值不存在
        if (left > right || arr[left] < arr[0] || arr[right] > arr[arr.length-1]){
            return -1;
        }
        //找mid的公式
        int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);
        if (arr[mid] > value){//向左递归
            return insertSearch(arr,left,mid-1,value);
        }else if (arr[mid] < value){//向右递归
            return insertSearch(arr,mid+1,right,value);
        }else{//正好找到
            return mid;
        }
    }
}

4.斐波那契(黄金分割法)查找

(1)思路

黄金分割:一条线段分割成两部分,其中一部分比上全长,接近0.618。
和前面两个相似,仅仅改变了中间结点(mid),mid位于黄金分割点附近,mid = left + F(k-1)-1, F是斐波那契数列,k代表第几个元素。
斐波那契数列:{1,1,2,3,5,8,13} 从第三个元素开始,就是前两个数相加的值。
初始数组:{1,6,16,26,888,1234},使用斐波那契查找。

在这里插入图片描述

(2)代码实现(java)

/**
 * 斐波那契查找
 * author:xinxin
 */
public class FibonacciSearch {
    static int  maxSize = 20;
    public static void main(String[] args) {
        int[] arr = {1,6,16,26,888,1234};
        int resVal = fibonacciSearch(arr,16);
        System.out.println("斐波那契查找下标为:"+resVal);
    }

    /**
     * 生成一个斐波那契数组
     * @return
     */
    public static int[] fib(){
        int[] fib = new int[maxSize];
        fib[0] = 1;
        fib[1] = 1;
        for (int i = 2; i < maxSize; i++) {
            fib[i] = fib[i-1] + fib[i-2];
        }
        return fib;
    }

    /**
     * @param arr   初始数组
     * @param value 要查找的值
     * @return 返回值,没找到返回 -1,找到返回下标
     */
    public static int fibonacciSearch(int[] arr,int value){
        int left = 0;
        int right = arr.length-1;
        int k = 0; //斐波那契数值的下标
        int mid = 0;
        int[] fib = fib();//获取斐波那契数列
        //获取斐波那契分割数值下标
        while(right > fib[k] - 1){
            k++;
        }
        int[] temp = Arrays.copyOf(arr,fib[k]);
        for (int i = right + 1; i < temp.length; i++) {
            temp[i] = arr[right];
        }

        //找到我们要找的值
        while(left <= right){
            mid = left + fib[k-1] - 1;
            if (value < temp[mid]){//向左查找
                right = mid - 1;
                k--;
            }else if (value > temp[mid]){//向右查找
                left = mid + 1;
                k = k - 2;
            }else {//找到
                if (mid <= right){
                    return mid;
                }else {
                    return right;
                }
            }
        }
        return -1;
    }
}

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

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

相关文章

Vue3引入Lottie动画以及遇到的坑

之所以写这个问题是因为原本我认为非常小的一件事却困扰了我一整天&#xff0c;所以我打算写一个博客记录一番。 国外动画网址&#xff1a;Lottie 将来用到的lottie组件库网址&#xff1a; Vue3-lottie 我目前用的第二个&#xff1a; Vue3-lottiejs 1. 我在引入Lottie的时…

【Python机器学习】决策树与随机森林的讲解及决策树在决策决策问题中实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 在生活中人们经常应用决策树的思想来做决定 分类的建模过程与上面做决定的过程相反&#xff0c;事先不知道人们的决策思路&#xff0c;需要通过人们已经做出的大量决定来“揣摩”出其决策思路&#xff0c;也就是通过大量数据来归纳道…

嵌入式分享合集124

一、19个常用的5V转3.3V技巧 01 使用LDO稳压器 标准三端线性稳压器的压差通常是 2.0-3.0V。要把 5V 可靠地转换为 3.3V&#xff0c;就不能使用它们。压差为几百个毫伏的低压降 &#xff08;Low Dropout&#xff0c; LDO&#xff09;稳压器&#xff0c;是此类应用的理想选择。图…

常见的CSS布局方法

常见的CSS布局方法 「1. 单栏布局」 常见的单列布局有两种: header,content 和 footer 等宽的单列布局header 与 footer 等宽,content 略窄的单列布局header,content 和 footer 等宽的单列布局 ​ 先通过对 header,content,footer 统一设置 width:1000px;或者 max-width:1…

DHCP报文

一. 介绍 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;统一使用两个IANA分配的端口&#xff1a;67&#xff08;服务器端&#xff09;&#xff0c;68&#xff…

Django学习Day5

由于前两天核酸阳的&#xff0c;一直发烧&#xff0c;故没有学习&#xff0c;csdn也没有进行更新。今天身体基本恢复&#xff0c;继续Django的学习旅程。也希望各位读者重视个人的身体健康&#xff0c;做好自己健康的第一负责人。 1.关于针对模型类的数据库修改方法补充 在mo…

二苯基环辛炔-氨基;DBCO-NH2科研实验用试剂DBCO-Amine;CAS:1255942-06-3

英文名称&#xff1a;DBCO-Amine DBCO-NH2 中文名称&#xff1a;二苯基环辛炔-氨基 CAS&#xff1a;1255942-06-3 分子式&#xff1a;C18H16N2 分子量&#xff1a;276.3 外观&#xff1a;固体粉末 溶剂&#xff1a;溶于 DMSO, DMF, DCM, THF, Chloroform 储存条件&…

什么是容器安全性,您如何提升自己的安全性?

容器无疑已成为部署应用程序的流行方式。这很棒&#xff0c;因为与部署到虚拟机相比&#xff0c;它们具有大量优势。其中一些优点包括便携、不可变和轻量级。您可以控制运行服务的容器内部的内容&#xff0c;这可以产生清晰、可审计的跟踪。 对于安全专业人员来说&#xff0c;…

模型复杂度与硬件性能的衡量

1. 模型复杂度的衡量 参数数量&#xff08;Params&#xff09;&#xff1a;指模型含有多少参数&#xff0c;直接决定模型的大小&#xff0c;也影响推断时对内存的占用量 单位通常为 M&#xff0c;通常参数用 float32 表示&#xff0c;所以模型大小是参数数量的 4 倍左右参数数…

数据结构C语言版 —— 树和二叉树的概念

树和二叉树 一、树 1. 树的概念 树(Tree)是n(n>0)n(n>0)n(n>0)个节点的有限集&#xff0c;在任意一颗非空树中&#xff1a; (1) 有且仅有一个特定的称为根(Root)的节点&#xff0c;根节点是没有前驱节点的。 &#xff08;2&#xff09;当 n>1n > 1n>1时…

_11LeetCode代码随想录算法训练营第十一天-C++队列的应用

_11LeetCode代码随想录算法训练营第十一天-C队列的应用 239.滑动窗口最大值347.前K个高频元素 239.滑动窗口最大值 整体思路 要实现一个单调递减队列&#xff1a; 对于滑动窗口的滑动&#xff0c;移除前面的元素&#xff0c;加入后面的元素。当移除前面的元素时&#xff0…

监控物联网卡该如何选择,你都踩过哪些坑?

不知道大家有没有发现在自己的身边不知不觉多了很多新玩意&#xff0c;例如智能自动售货机、共享单车、智能监控设备等&#xff0c;它们让大家的生活变得越来越方便&#xff0c;那么大家知道它们为什么能起到这么大的作用吗&#xff0c;其实得得益于一个叫做物联网卡的东西。前…

通过kubeode安装k8s

文章目录通过kubeode安装k8s1、准备vmdk文件2、创建虚拟机3、进入虚拟机4、配置yum源5、清理6、 增加node服务器7、修改Ip8、下载下载通道01 走普通家庭宽带下载点下载通道02 走群友无私赞助电信机房专线服务器--高速稳定下载----强烈推荐下载并解压9、一键安装通过kubeode安装…

字符串函数剖析(1)

带你玩转字符串 1.strlen函数不一样的细节 1.1模拟实现strlen函数 2.strcpy函数的巧妙 2.2strcpy的模拟实现 3.strcmp函数的巧妙 3.2strcmp的模拟实现 详解strlen的细节 首先了解strlen 函数的参数 size_t strlen ( const char * str );size_t 是什么东西呢&#xff1f…

链表-------数据结构

链表(重点): 链表是物理存储结构上面非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 1)在顺序表中&#xff0c;我们不光引入了一段连续的内存&#xff0c;还引入了一块连续的内存空间&#xff0c;叫做usedsize&#xff0c;来表示对应数组中…

PMP每年考几次,费用如何?

PMP每年考四次&#xff0c;整个考证一次通关大致需要 7000 元左右&#xff0c;主要是下面几项费用&#xff1a; 部分学习笔记&#xff1a; 一、考证费用 分为基础费用报班费用 基础费用&#xff1a;报名费续证费用&#xff08;补考费 / 退考费&#xff09; 报名费 3900 元是固…

【软件测试】测试人的内卷,掀起血雨腥风......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 铺天盖地的职场内卷…

如何利用深度学习中的AutoEncoder进行特征降维和特征可视化,pytorch代码

我们将使用 Pytorch 中的 AutoEncoder(自动编码器架构)来减少特征维度和可视化。 北大出版社&#xff0c;人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理 人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典 首先&#xff0c…

力扣(142.1002)补9.17

142.环形链表Ⅱ 不会&#xff0c;不过答案用了数学的想法&#xff0c;我以为计算机里只有暴力呢。 public class Solution { public ListNode detectCycle(ListNode head) { if(headnull||head.nextnull) return null; ListNode phead; ListNode p2head; while(true){ if(p2.ne…

Excel教程之学生成功所需的 5 个电子表格

作为一名学生,跟踪你盘子里的所有任务和责任可能会让人不知所措。 这就是为什么拥有一套组织良好的电子表格可以成为救命稻草的原因。出于多种原因,维护自己的电子表格可能是一项宝贵的技能。首先,它可以帮助您养成良好的习惯,例如组织和关注细节。通过创建和维护您自己的…