首页 > 其他分享 >二分法查找

二分法查找

时间:2023-10-09 19:35:21浏览次数:31  
标签:10 arr 下标 19 元素 二分法 查找

二分法原理:

使用二分法一定要是先排序好的数组,如果没有排序好,比较只有可能怎么找都找不到

数组: 10(下标0) 11 12 13 14 15 16 17 18 19 20(下标10)  

    通过二分法查找,例如需要找出19这个元素的下标:
        (0 + 10) / 2 --> 中间元素的下标: 5

    拿着中间这个元素和目标要查找的元素进行对比:
        中间元素是:arr[5] --> 15
        15 < 19(被查找的元素)
        被查找的元素19在目前中间元素15的右边。
        所以开始元素的下标从0变成 5 + 1.

    再重新计算一个中间元素的下标:
        开始下标是:5 + 1
        结束下标是:10
        (6 + 10) / 2 --> 8

    8下标对应的元素arr[8]是18
    18 < 19(被查找的元素)
    被查找的元素19在18的右边
    所以开始元素的下标标为8+1=9
    开始下标是9
    结束下标是10
    (9 + 10)--> 9
    9对应的下标元素是19
        找到的中间元素正好和被找的的元素19相等,表示找到了:下标为9
public class ArrayErfenfa {
    public static void main(String[] args) {

        int[] arr = {1,2,3,5,6,10,20,22};

        int index = binarySearch(arr, 10);
        System.out.println(index == -1 ? "该元素不存在!" : "该元素下标" + index);
    }

    /**
     * 从数组中查找目标元素的下标
     * @param arr 被查找的数组(这个必须是已经排序的。)
     * @param dest 目标元素
     * @return -1表示该元素不存在,其它表示返回该元素的下标。
     */
    public static int binarySearch(int[] arr, int dest) {
        // 开始下标
        int begin = 0;
        // 结束下标
        int end = arr.length - 1;
        // 开始元素的下标只要在结束元素下标的左边,就有机会继续循环。
        while(begin <= end) {
            // 中间元素下标
            int mid = (begin + end) / 2;
            if (arr[mid] == dest) {
                return mid;
            } else if (arr[mid] < dest) {
                // 目标在“中间”的右边
                // 开始元素下标需要发生变化(开始元素的下标需要重新赋值)
                begin = mid + 1; // 一直增
            } else {
                // arr[mid] > dest
                // 目标在“中间”的左边
                // 修改结束元素的下标
                end = mid - 1; // 一直减
            }
        }
        return -1;
    }

}

 

标签:10,arr,下标,19,元素,二分法,查找
From: https://www.cnblogs.com/hyy-0/p/17617751.html

相关文章

  • 关于折半查找的某个例题的理解
    1-习题展示2-习题解决我们都知道折半查找就是比较中间的数,然后决定查找左边还是右边。那么,对于这个题,我们只需要将序列按照二叉排序树的条件画出来,就会发现,B选项有分叉出现,不是左拐右拐的那种分叉。答案就出来啦~......
  • 由于蚂蚁老师课程视频中博客园网站更新,代码不适用于现有环境,故网上查找更新:网上爬取博
    importjsonimportreimportrequestsfrombs4importBeautifulSoupfOut=open("博客爬取文章列表标题及地址.txt","w",encoding="utf8")foridxinrange(20):print("#"*50,idx+1)url="https://www.cnblogs.com/AggSite/......
  • 磁盘清理、大文件查找、磁盘扩容、定时任务
    磁盘清理 rm-rf 脚本:#!/bin/shcd/;find-name"java_pid*.hprof"-execrm-rf{}\;或者rm-rf/java_pid*\.hprof大文件查找查找并列出当前目录中最大的目录:du-h--max-depth=1查找当前目录中所有文件的大小du-sh*   磁盘扩容 一、      增加......
  • 在Linux中如何查找包含特定文本(字符串)的所有文件?
    内容来自DOChttps://q.houxu6.top/?s=在Linux中如何查找包含特定文本(字符串)的所有文件?如何在文件内容中查找包含特定文本字符串的所有文件?以下方法不起作用,似乎显示了系统中的每个文件。find/-typef-execgrep-H'text-to-find-here'{}\;请执行以下操作:grep-r......
  • 常数时间对数组进行-删除-查找-随机提取元素
    参考:380.O(1)时间插入、删除和获取随机元素众所周知,数组这类数据结构可以实现O(1)的获取,所以结合rand()函数就能实现随机获取,但是数组的存储方式又是连续的,这就意味着,插入和删除时需要有大量的元素需要移动,所以不能实现O(1)的插入(末尾除外)和删除。能够实现O(1)的插入和删除的......
  • 02-JZ4 二维数组中的查找
    我的想法:暴力:按行遍历,比较---O(m*n)折半:行折半查找;有n行,折半n次----O(nlgn)问题:不满足时间复杂度O(m+n)正确思路:左下角开始比较arr[i][0]>target--往小找,往上走,i--;arr[i][0]<target--往大找,往右走,j++;arr[i][0]==target,即找到循环截至条件,超出数组边界适用场景:迷宫......
  • 第7章 查找
    一、顺序查找O(n)一般线性表的顺序查找有哨兵typedefstruct{ ElemType*elem;//存储空间基址,建表时按实际长度分配,0号单元留空 intTableLen;}SSTable;intSearch_Seq(SSTableST,ElemTypekey){ ST.elem[0]=key;//哨兵 for(inti=ST.TableLen;ST.elem[i]!=k......
  • 如何查找Model的state_dict和ckpt的state_dict之间的差距
    参考资料:[自己摸索][chatgpt3.5]众所周知,Huggingface团队的transformers库是一个非常优秀非常方便的库,它使得很多模型实现了“开箱即用”。但是,由于transformers这个库的快速迭代,也导致了很多兼容性上的问题。比如今天我发现一个现象:我使用老板的transformers......
  • 如何查找python对象或类的父类子类以及用法
    一个类其方法和数据的来源可以是自定义,也可以是继承自各级父类。通过dir查看其方法和属性,通过help查看其使用方法。特别地,可通过Base和subclass寻找其父类和其他子类。亦可通过文档研究其继承关系。文档不仅包含自身类,也包括其父类的属性方法。  python>>>help(op("/projec......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......