算法(二)二分查找

文章目录

  • 二分查找简介
  • 实现方式
    • 循环方式
    • 递归方式
  • 经典例子

二分查找简介

  • 二分查找(binary search)算法,也叫折半算法。
  • 二分查找是针对有序的数据集合的查找办法,如果是无序的数据结合就使用遍历。
  • 二分查找之所以快速,是因为它再匹配不成功的时候,每次都能排除剩余元素中一半的元素,因此包含目标元素的有效范围就会收缩非常快。
  • 时间复杂度: T(n) = O(logn)
    在这里插入图片描述

实现方式

循环方式

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description: 在一个有序集合中,查找某数是否存在 -- 基础实现
 * @date 2024/5/30 0:40
 */
public class Demo01 {

    public static void main(String[] args) {
        //有序数组
        int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
        System.out.println(binarySearch(nums,66));
        System.out.println(binarySearch(nums,55));
    }

    /**
     * @description  二分法基础实现
     * @author  xxliao
     * @date  2024/5/30 0:47
     */
    public static int binarySearch(int[] array,int destNum) {
        // 低索引
        int low = 0;
        // 高索引
        int high = array.length -1;
        // 中间索引
        int mid = 0;
        while(low<=high) {
            mid = (low + high) / 2;
            if(array[mid] == destNum) {
                return mid; //相等,找到该索引
            }else if(destNum < array[mid]){
                high = mid - 1; // 比中间值小,
            }else{
                low = mid + 1; // 比中间值大
            }
        }
        return -1;
    }
}

测试结果:
在这里插入图片描述

递归方式

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description: 在一个有序集合中,查找某数是否存在 -- 递归实现
 * @date 2024/5/30 0:40
 */
public class Demo02 {

    public static void main(String[] args) {
        //有序数组
        int[] nums = {3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
        System.out.println(binarySearch(nums,48));
        System.out.println(binarySearch(nums,55));
    }

    /**
     * @description  二分法 递归实现
     * @author  xxliao
     * @date  2024/5/30 0:47
     */
    public static int binarySearch(int[] array,int destNum) {
        // 低索引
        int low = 0;
        // 高索引
        int high = array.length -1;
        return binarySearch(array,low,high,destNum);
    }

    private static int binarySearch(int[] array,int low,int high,int destNum){
        //定义递归结束条件
        if(low > high)
            return -1;
        int mid = (low + high) / 2;
        if(array[mid] == destNum) {
            return mid; //相等,找到该索引
        }else if(destNum < array[mid]){
            high = mid - 1; // 比中间值小,
        }else{
            low = mid + 1; // 比中间值大
        }
        return binarySearch(array,low,high,destNum);
    }
}

测试结果:
在这里插入图片描述

经典例子

一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数
比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7。

使用二分查找: 1 有序、 2、时间复杂度 O(logn)。
偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对。
偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对。

package com.xxliao.algorithms.binary_search.demo;

/**
 * @author xxliao
 * @description:
 * 一个有序数组有一个数出现1次,其他数出现2次,找出出现一次的数
 * 比如:1 1 2 2 3 3 4 4 5 5 6 6 7 出现1次的数是7
 *
 * 使用二分查找: 1 有序、 2、时间复杂度 O(logn)
 * 偶数位索引跟后面的比相同,奇数位索引跟前面的比相同 则说明前面的都对
 * 偶数位索引跟前面的比相同,奇数位索引跟后面的比相同 则说明后面的都对
 *
 * @date 2024/5/30 1:06
 */

public class Demo03 {
    public static void main(String[] args) {
        int[] nums={1,2,2,3,3,4,4,5,5};
        //int[] nums = {1,1, 2, 2, 3, 4, 4, 5, 5,6,6,7,7};
        System.out.println(binarySearch(nums));
    }

    public static int binarySearch(int[] nums) {
        //低位索引
        int low = 0;
        //高位索引
        int high = nums.length - 1;
        //中间索引
        int mid = 0;
        while (low < high) {

            mid = (low + high) / 2;

            if (mid % 2 == 0) {//偶数位

                if (nums[mid] == nums[mid + 1]) {
                    // 与后面的数相等,前面的都对
                    low = mid + 1;
                } else if (nums[mid] == nums[mid - 1]) {
                    // 与前面的数相等,后面的都对
                    high = mid - 1;
                } else {// 就是这个数
                    return nums[mid];
                }
            } else {//奇数位

                if (nums[mid] == nums[mid - 1]) {
                    // 与前面的数相等,前面的都对
                    low = mid + 1;
                } else if (nums[mid] == nums[mid + 1]) {
                    //与后面的数相等,后面的都对
                    high = mid - 1;
                } else { // 就是这个数
                    return nums[mid];
                }
            }
        }
        //low=high
        return nums[low];
    }
}

测试结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dijkstra求最短路篇二(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)

前言&#xff1a; Dijkstra算法博客讲解分为两篇讲解&#xff0c;这两篇博客对所有有难点的问题都会讲解&#xff0c;小白也能很好理解。看完这两篇博客后保证收获满满。 第一篇博客讲解朴素Dijkstra算法Dijkstra求最短路篇一(全网最详细讲解两种方法&#xff0c;适合小白)(p…

原码一位乘法(计算机组成原理)

算法原理 每次将1位乘数所对应的部分积与原部分积的“累积和”相加&#xff0c;并移位 设置寄存器 存放部分积累积和、乘积高位存放被乘数存放乘数、乘积低位 法则 乘积的数值位俩数绝对值之积&#xff1b;符号位 位 俩数符号位进行异或&#xff0c;即 p x ⊕ y 步骤 设…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高...

你好&#xff0c;我是郭震 这篇教程主要解决&#xff1a; 1). 有些读者朋友&#xff0c;电脑配置不高&#xff0c;比如电脑没有配置GPU显卡&#xff0c;还想在本地使用AI&#xff1b; 2). Llama3回答中文问题欠佳&#xff0c;想安装一个回答中文问题更强的AI大模型。 3). 想成为…

Frida使用与解题

对于 Android 逆向&#xff0c;首先需要熟悉对于 adb 基本命令使用 1.C:\Users\sun>adb shell ASUS_I003DD:/ # getprop ro.product.cpu.abi x86_64 查看架构 exit 退出 2. adb push "E:\reverse\ida\IDA_Pro_7.7\IDA_Pro_7.7\IDA_Pro_7.7\dbgsrv\android_x86_ser…

通用代码生成器应用场景四,跨编程语言翻译

通用代码生成器应用场景四&#xff0c;跨编程语言翻译 如果您有一个Java工程&#xff0c;想把它移植到Rust或Golang语言中去&#xff0c;希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的&#xff0c;保留了系统的SGS源文件或者SGS2的Excel模板&#xff0c;您可…

【Redis】 使用Java操作Redis的客户端

文章目录 &#x1f343;前言&#x1f334;项目的创建&#x1f38b;引入依赖&#x1f333;配置端⼝转发&#x1f332;更改 Redis 配置文件&#x1f384;连接 Redis Server⭕总结 &#x1f343;前言 我们使用 Java 操作 Redis 客户端时我们需要进行以下操作。 注意&#xff1a;J…

安装软件缺少dll文件怎么办,分享多种解决dll问题的方法

在计算机使用过程中&#xff0c;我们经常会遇到安装软件时提示缺少dll文件的问题。这种情况通常会导致软件无法正常运行或启动。为了解决这个问题&#xff0c;我总结了以下五种方法&#xff0c;希望对大家有所帮助。 一&#xff0c;了解DLL文件是什么 动态链接库&#xff08;D…

AI 学习神器!大学生必备的 22个 AI 提示词模板

AI 学习神器&#xff01;大学生必备的 22个 AI 提示词模板 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘…

车载电子电器架构 —— 智能座舱技术范围(万字长文精讲)

车载电子电器架构 —— 智能座舱技术范围 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

DASK==python并行计算

文档10 Minutes to Dask — Dask documentation demo代码 import numpy as np import pandas as pd import dask.dataframe as dd import dask# 设置调度器为多线程 dask.config.set(schedulerthreads) # 创建一个示例的Pandas DataFrame index pd.date_range("2021-09…

云技术最全详解

目录 云技术 1.定义 2.特点 2.类型 2.1IaaS&#xff08;基础设置即服务&#xff09; 2.2PaaS&#xff08;平台即服务&#xff09; 2.3SaaS&#xff08;软件即服务&#xff09; 3.云技术模型 3.1公有云 3.2私有云 3.3混合云 云技术 1.定义 云技术是一种云计算和存储…

最新版ERP进销存网络多仓版WEB源码

安装说明 环境要求&#xff1a; PHP5.6MYSQL5.6 1.恢复数据库.sql数据 2.配置sql参数连接路径&#xff1a;application\config\database.php 3.前台登录用户名&#xff1a;admin 密码&#xff1a;admin 源码免费下载地址抄笔记 (chaobiji.cn)

一键AI抠图,证件照换背景,可部署成自己的应用

1 开发背景 AI抠图技术已经非常成熟&#xff0c;并且有效果非常好的开源模型。 日常中可以用于替换证件照背景 但是网上许多的证件照替换背景 竟然需要收费 鉴于此&#xff0c;便将目前最好的&#xff08;SOTA&#xff09;开源抠图模型 BRIA Background Removal v1.4 Model …

【AIGC-数字人】V-Express:渐进式训练的数字人视频生成技术

介绍 在人像视频生成领域&#xff0c;使用单张图像生成人像视频已经变得越来越普遍。一种常见的方法涉及利用生成模型来增强适配器以实现受控生成。然而&#xff0c;控制信号的强度可能会有所不同&#xff0c;包括文本、音频、图像参考、姿态、深度图等。其中&#xff0c;较弱的…

奇偶校验位

描述 题目描述&#xff1a; 现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果&#xff08;1输出奇校验&#xff0c;0输出偶校验&#xff09; 信号示意图&#xff1a; 波形示意图&#xff1a; 输入描述&#xff1a; 输入信号 bus sel 类型 wi…

gitlab之cicd的gitlab-runner集成-dockerfile构建环境

目录 概述离线资源docker-compose问题 docker-compose问题1问题2 gitlab-runner集成gitlab 概述 cicd引文目录是想通过dockerfile构建 maven、jdk、docker环境的 gitlab-runner 运行环境。但docker最后测试的时候有点问题&#xff0c;且最后使用 kubectl 时有麻烦&#xff0c;所…

牛客网刷题 | BC103 金字塔图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

共计3万字!从零开始创建一个小规模的稳定扩散模型!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

知识运维概述

文章目录 知识运维研究现状技术发展趋势 知识运维 由于构建全量的行业知识图谱成本很高&#xff0c;在真实的场景落地过程中&#xff0c;一般遵循小步快走、快速迭代的原则进行知识图谱的构建和逐步演化。知识运维是指在知识图谱初次构建完成之后&#xff0c;根据用户的使用反馈…

“手撕”链表的九道OJ习题

目录 1. 第一题 2. 第二题 3. 第三题 4. 第四题 5. 第五题 6. 第六题 7. 第七题 8. 第八题 9. 第九题 1. 第一题 删除链表中等于给定值 val 的所有节点。OJ链接 思路如下&#xff1a; 相当于链表的removeAll();制定prev和cur&#xff0c;prev记录前一个节点&#xff…