首页 > 编程语言 >数据结构与算法 | 二分搜索(Binary Search)

数据结构与算法 | 二分搜索(Binary Search)

时间:2023-10-30 14:35:00浏览次数:40  
标签:二分 Binary Search min 算法 搜索 数组 数据结构

二分搜索(Binary Search)

文承上篇,搜索算法中除了深度优先搜索(DFS)和广度优先搜索(BFS),二分搜索(Binary Search)也是最基础搜索算法之一。

二分搜索也被称为折半搜索(Half-interval Search)也有说法为对数搜索算法(Logarithmic Search),用于在已排序的数据集中查找特定元素。

搜索过程从排序数据集的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束返回元素;如果某一特定元素大于或者小于中间元素,则在排序数据集中大于或小于中间元素的那一半中查找,继续重复开始的流程。反之亦然,如果在某一步骤排序数据集为空,则代表找不到。正如其名“二分”:每一次比较都使搜索范围缩小一半。

如果是对算法发展史有兴趣,二分搜索算法是算得上拥有一段悠长历史。最早可追溯到公元前200年的巴比伦尼亚中就有出现利用已排序的物件序列去加快搜索的构想,虽然该算法在计算机上的清楚描述出现在1946年约翰莫齐利(John Mauchly)的一篇文章里。

基本应用

二分搜索,最基本的应用就是查找特定元素。

LeetCode 35. 搜索插入位置【简单】

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。

请在此添加图片描述

使用递归进行编码逻辑也二分搜索常见的编程技巧之一,当然也并非一定要用递归的方式;不妨再练习一道题。

LeetCode 275. H指数 II 【中等】

给你一个整数数组 citations ,其中 citationsi 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。

请你设计并实现对数时间复杂度的算法解决此问题。

请在此添加图片描述

综合应用

对于问题解决往往可以有不同的算法思路来实现,对比来看或许更能感受到"二分"与"折半"的意义。不妨来一起感受下下面这题:

LeetCode 209. 长度最小的子数组【中等】

给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 numsl, numsl+1, ..., numsr-1, numsr ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

请在此添加图片描述

请在此添加图片描述

请在此添加图片描述

除开以上的解法,抛开使用前缀和的思路,也可以应用本系列第一篇数组中双指针的编程技巧来解。利用两个指针标识连续子数组的首位,再根据 总和 与 target之间的情况进行灵活调整指针也可以计算出最小长度;

在此不过多描述,附上代码:

public int minSubArrayLen(int target, int[] nums) {
        
        int left = 0,right = 0,sum = 0,min = Integer.MAX_VALUE;
        
        while(right < nums.length){
            sum += nums[right++];
            while (sum  >= target && left < right){
                min = Math.min(min,right - left);
                sum -= nums[left++];
            } 
        }
        
        return  min == Integer.MAX_VALUE ? 0:min;
    }

总结下

  • 二分搜索是一种具有悠久历史的高效搜索算法,介绍基本算法流程;
  • 透过算法问题进行了递归编码、递推编码以及使用JDK库函数实现二分搜索;
  • 算法问题一般都有多种解法,通过对比更好理解二分的特性;

标签:二分,Binary,Search,min,算法,搜索,数组,数据结构
From: https://www.cnblogs.com/jzhlin/p/binary_search.html

相关文章

  • 05数据结构(栈、队列、数组、链表)
    数据结构一、什么是数据结构计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。一般情况下,精心选择的数据结构可以带来更高的运行或者存储效率。如何学习数据结构:每......
  • 推出 Amazon Lightsail for Research
    AmazonLightsail 现在提供AmazonLightsailforResearch,这是一项新产品,可让您轻松利用云的力量加快研究速度。通过LightsailforResearch,您只需单击记下即可访问在功能强大的虚拟计算机上运行的Scilab、RStudio和Jupyter等分析应用程序。亚马逊云科技开发者社区为开发......
  • 数据结构之散列表与哈希函数初识
    一:概述一:为什么需要散列表*在我们的程序世界里,往往也需要在内存中存放这样一个“词典”,方便我们进行高效的查询和统计。*例如开发一个学生管理系统,需要有*通过输入学号快速查找对应学生的姓名的功能。*这里不必要每次都去查询数据库,而可以在内存中建立一个缓存表,这样做可以......
  • 数据结构与算法-cnblog
    数据结构与算法课程笔记树与二叉树树的深度与高度高度就可以理解为深度看层数:如果根结点第0,层数=深度=高度-1如果根结点第1,层数=深度=高度深度定义是从上往下的,高度定义是从下往上的......
  • PAT甲级:1174 Left-View of Binary Tree
     题目:1174Left-ViewofBinaryTree25分 题解:层次遍历输出每一行最左边的元素。(最开始以为输出部分节点的左子树...想不到思路)usingnamespacestd;#include<iostream>#include<vector>#include<map>#include<algorithm>#include<queue>#include<cmath>......
  • Python数据结构——栈
    栈(Stack)是一种基本的数据结构,它遵循“后进先出”(Last-In-First-Out,LIFO)的原则,即最后放入栈的元素最先出栈。栈常用于管理函数调用、表达式求值、括号匹配等问题。本文将详细介绍Python中栈数据结构的使用,并提供示例代码来说明。什么是栈?栈是一种线性数据结构,它由一组元素组成,支持两......
  • 数据结构之树(二叉树)
    什么是二叉树(binarytree)?在树结构的基础上,要求其中每个节点最多有两个子节点(一个节点最多有2个边)。二叉树由根节点和若干个左子树和右子树构成,这些子树也都是二叉树。二叉树可以为空树,也可以只包含一个根节点。为什么树形结构常用二叉树呢?就是为了省空间。n叉树,n越大就需要更......
  • NOIP[区间数据结构类问题]
    平面最近点对经典的分治问题,把所有的点按照\(x\)排序,然后分治处理两个子区间,然后枚举离中心少于已知最小值的点,判断能否出现更小值。intn,temp[250000];structnode{ intx,y;}a[500500];boolcmp(nodel,noder){ if(l.x==r.x)returnl.y<r.y; returnl.x<r.x;}doub......
  • 【数据结构】- 并查集
    并查集简介并查集是可以维护元素集合的数据结构。并查集通过把一个集合作为一棵树的方式,维护一个森林(这暗含并查集可以维护连通块个数,如在kruskal中,通过并查集维护连通块个数就能快速判断循环退出条件),并使用树的根节点代表各集合。这样一棵树的节点就对应该集合中的元素......
  • C++---数据结构---队列(queue)
    queue容器queue基本概念概念:Queue是一种先进先出(FirstInFirstOut,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为—入队push队列中出数据称为—出队popque......