二分搜索(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)的更多相关文章

  1. 数据结构与算法--二分搜索(binary search)

    前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...

  2. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  3. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  4. 《算法导论》习题2.3-5 二分搜索 Binary Search

    地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢? 知易行难,自己动手写一下试一试吧. public class BinarySearch { public ...

  5. 第二十六篇 玩转数据结构——二分搜索树(Binary Search Tree)

          1.. 二叉树 跟链表一样,二叉树也是一种动态数据结构,即,不需要在创建时指定大小. 跟链表不同的是,二叉树中的每个节点,除了要存放元素e,它还有两个指向其它节点的引用,分别用Node l ...

  6. 二分搜索 - Binary Search

    二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. 算法与数据结构基础 - 二叉查找树(Binary Search Tree)

    二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...

  9. 二分搜索(Binary Search)

    当我们在字典中查找某个单的时候,一般我们会翻到一个大致的位置(假设吧,翻到中间位置),开始查找.如果翻到的正好有我们要的词,那运气好,查找结束.如果我们要找的词还在这个位置的前面,那我们对前面的这一半 ...

  10. 数据结构之Binary Search Tree (Java)

    二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...

随机推荐

  1. .Net FrameWork下面如何生成AOT呢?

    前言 其实AOT预编译,在.Net FrameWorker1.0里面就有了.它叫做Ngen,只不过当时叫做生成本机映像,实际上还是一个东西,也就是预编译.本篇来看下. 概括 1.介绍 现在的现代化的. ...

  2. stegsolve与zsteg的使用

    zsteg 介绍:用来检测PNG和BMP中隐藏数据的工具,可以快速提取隐藏信息 使用环境:kali kali自带zsteg,可以用这个指令使用 gem install zsteg 下载完之后查看使用方 ...

  3. Nginx配置Https缺少SSL模块(已解决)

    1.Linux下Nginx配置https nginx下载和安装此处就忽略,可自行百度 1.1.配置https 打开nginx配置文件 vim /usr/local/nginx/conf/nginx.c ...

  4. Spring-Bean实例化三种的方式

    Bean实例化三种方式 无参构造实例化(重点) 工厂静态方法实例化 工厂实例方法实例化 工厂静态方法实例化 1.编写接口 package com.my; public interface UserDa ...

  5. DevOps|服务治理与服务保障实践指南

    朱晋君@君哥聊技术 我自己为了消化里边的内容,整理了一个脑图,希望对你有帮助. 凌晨四点被公司的监控告警叫醒了,告警的原因是生产环境跑批任务发生故障.即刻起床处理故障,但还是花了不少时间才解决. 这次 ...

  6. 自用gulp打包脚本,压缩html,压缩js,压缩css,压缩图片,功能齐全

    const gulp = require('gulp'); const fs = require('fs'); const htmlmin = require('gulp-htmlmin'); con ...

  7. C# 中的 数组[]、ArrayList、List

    C# 中的 数组[].ArrayList.List 数组 在 C# 中,数组实际上是对象,而不只是如在 C 和 C++ 中的连续内存的可寻址区域. 属性: 数组可以是一维.多维或交错的. 创建数组实例 ...

  8. 好用工具:Wappalyzer

    说明 这个插件可以检测到网站使用的技术栈,是一个好玩的技术嗅探插件 安装 使用

  9. PB从入坑到放弃(六)动态SQL应用

    写在前面 动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了SQL的灵活性 一.执行SQL语句 1.1 执行无入参SQL ① 语法 EXECUTE I ...

  10. Spring Secriuty登录失败错误状态999重定向302

    原因是login.html登录页面有不能加载的静态资源,找出来去掉就好了,比如 bootstrap.min.css 环境 使用Spring Boot Security 3做一个登录功能,使用了一个教程 ...