首页 > 编程语言 >算法篇--二分算法

算法篇--二分算法

时间:2022-12-23 20:22:06浏览次数:57  
标签:二分 ... right -- mid 算法 查找 left

1. 基本介绍

二分思想一般用于查找,见其名知其意,这是一个半半开的算法。第一次接触二分思想的时候是高中的数学学习中,给定一个方程 f(x) = 0的根所在的区间,可以用根存在定理不断二分区间,当区间长度小于给定的精度时,即可近似求出方程的解,当然也可以用来求平方根和立方根等。同样,这种查找思想也可以运用于计算机内结构化数据的查找。(tips: 二分查找思想简单,细节魔鬼)。(详讲博客推荐)

二分查找有很多应用,由于其时间复杂度很低,它可以暴力破解很大的数据。

  1. 核心思想

使用二分查找的前提:待查找序列必须有序(升序或降序,本文主要以升序为例)

确定查找区间(left, right),取区间中间值mid = (left + right)/2,比较中间值与左右两边的值,确定待查元素key所在区间,舍弃无效区间(mid = left 或mid = right)。

 

 

思路很简单,细节是魔鬼。

一:二分法算法分析
1、二分查找算法定义
二分查找又称折半查找,它是一种效率较高的查找方法。

二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。

2、基本思想
(1)首先确定该区间的中点位置

(2)将待查的K值与R[mid]比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找

(3) ① 若R[mid].key>K,将查找区间变为**[left,mid-1]**

​ ②若R[mid].key<K,将查找区间变为**[mid+1,right]**

3、优缺点
③ 二分查找的优点

折半查找的时间复杂度为O(logn),远远好于顺序查找的O(n)。

④ 二分查找的缺点

虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。

4、二分查找常用场景
寻找一个数、寻找左侧边界、寻找右侧边界。

细节:

​ while循环中的不等号是否应该带等号,mid 是否应该加一等等。

5、二分查找常用框架

 1 int binarySearch(int[] nums, int target) {
 2     int left = 0, right = ...;
 3 
 4     while(...) {
 5         int mid = left + (right - left) / 2;
 6         if (nums[mid] == target) {
 7             ...
 8         } else if (nums[mid] < target) {
 9             left = ...
10         } else if (nums[mid] > target) {
11             right = ...
12         }
13     }
14     return ...;
15 }

 

分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节

计算 mid 时需要技巧防止溢出,建议写成: mid = left + (right - left) / 2
————————————————
版权声明:本文为CSDN博主「噜啦啦412」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_57229058/article/details/123763083

 

标签:二分,...,right,--,mid,算法,查找,left
From: https://www.cnblogs.com/Gaowaly/p/17001556.html

相关文章

  • 国产化EtherCAT主站控制器解决方案,米尔基于全志T507-H核心板
    EtherCAT是由德国BECKHOFF自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点,支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片,主站使......
  • C语言实现udp
    #include<stdio.h>#include<strings.h>#include"arpa/inet.h"typedefunionstd{unsignedshorta;unsignedcharb[2];}STD;voidudp_server(){......
  • JSTL的常用标签choose和foreach
    JSTL的常用标签choosec:choose标签:<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/co......
  • 数字化智能工厂
    1数字化智能工厂解决方案在工业4.0和中国制造2025的大背景下,智能制造的整体解决方案,解决方案全景如下: 解决方案全景整体解决方案由智能化生产、智能化管理和产业链......
  • buuoj-pwn-gwctf_2019_shellcode
    buuoj-pwn-gwctf_2019_shellcode总结可见字符shellcode优先判断能不能利用\x00非预期一手题目分析IDA打开,看不了main函数,但是汇编也挺简单的,看看汇编就知道是打开沙......
  • Java继承
    显示所有属性:alt+shift+s封装快捷键:alt+shift+s+r什么是继承?继承是符合人类现实世界的一种概念,它的作用把相同的属性和方法抽取出来,提供可以被继承的子类使用,实现......
  • Java多态
    什么是多态?同一个引用类型,使用不同的实例来执行不同的操作;同一个父类,使用不同的子类对象执行不同的操作。多态的实现:1、声明父类创建子类(向上转型:子类转为父类自动......
  • 算法篇--递归
    递归一、算法思想:1、定义:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。2、特点:递归有两个显著的......
  • 流处理基础概念-延迟/吞吐/窗口/时间
    在批处理场景中,我们主要通过一次计算的总耗时来评价性能。在流处理场景,数据源源不断地流入系统,大数据框架对每个数据的处理越快越好,大数据框架能处理的数据量越大越好。衡量......
  • 教你用JavaScript实现进度条
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条。进度条数字自动增加,条状图片动画演示进度完成度。通过实......