数据结构与算法 | 二分搜索(Binary Search)
二分搜索(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)的更多相关文章
- 数据结构与算法--二分搜索(binary search)
前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- LeetCode算法题-Binary Search(Java实现)
这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...
- 《算法导论》习题2.3-5 二分搜索 Binary Search
地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢? 知易行难,自己动手写一下试一试吧. public class BinarySearch { public ...
- 第二十六篇 玩转数据结构——二分搜索树(Binary Search Tree)
1.. 二叉树 跟链表一样,二叉树也是一种动态数据结构,即,不需要在创建时指定大小. 跟链表不同的是,二叉树中的每个节点,除了要存放元素e,它还有两个指向其它节点的引用,分别用Node l ...
- 二分搜索 - Binary Search
二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 算法与数据结构基础 - 二叉查找树(Binary Search Tree)
二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...
- 二分搜索(Binary Search)
当我们在字典中查找某个单的时候,一般我们会翻到一个大致的位置(假设吧,翻到中间位置),开始查找.如果翻到的正好有我们要的词,那运气好,查找结束.如果我们要找的词还在这个位置的前面,那我们对前面的这一半 ...
- 数据结构之Binary Search Tree (Java)
二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...
随机推荐
- LeanCloud 国内域名解析问题,博客评论及阅读数显示失败
近日,LeanCloud 国内域名解析存在问题,个人博客基于LeanCloud构建的评论及阅读数显示失败. 个人博客地址 关于 LeanCloud 国内域名解析问题的情况更新(6 月 21 日) 声明 ...
- 2023河南省ICPC大学生程序设计竞赛-wh
第一次出去比赛,首先感谢程老师选择我们新生更多的比赛机会,感谢! 在周六我们一起做了高铁出发取洛阳参加icpc河南省赛,不得不说洛阳师范学院确实环境很好看..在热身赛时,已经被泼了冷水,这C也太难了, ...
- 磁盘问题和解决: fsck,gdisk,fdisk等
错误: Resize inode not valid 对于gpt分区的硬盘一般fsck只能检查分区, 不能用于检查整个硬盘, 但是如果对硬盘设备运行时遇到这样的错误 $ sudo fsck -n /d ...
- 从零玩转系列之微信支付实战PC端支付微信回调接口搭建
一.前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布 ...
- excel 启用迭代计算
迭代,即计算程序中一组指令的重复.在Excel中有些公式需要启用迭代计算,才能正常运算. 注:公式直接或间接引用自身单元格,会导致计算结果不正确,可以尝试使用该方法解决.所愿单元格的初始值都为0. 参 ...
- Tcpdump 使用指南
论网络数据包的分析,我首选wireshark,因为图形化界面直观明了.但如果遇到没有图形化显示的Linux环境,那么此时会使用tcpdump该是一件多么美好的事情. 网上关于tcpdump的介绍很多, ...
- C#性能优化-树形结构递归优化
前言 大家好,我是wacky,最近在工作中遇到一个有趣的问题,同事反馈说WPF中有一个树形结构的集合,在加载时会直接报堆栈溢出,一直没时间(懒得)看,导致很久了也没人解决掉.于是,组长就把这个&quo ...
- 通过Scrum实现最大生产力的五种方法
在数字化.信息化.智能化蓬勃发展的今天,敏捷开发和Scrum已成为重塑项目管理的重要方式. 敏捷是一种体现不同方法的思维方式,包括了Scrum,看板,极限编程(XP).精益开发等众多框架. Scrum ...
- 《SQL与数据库基础》11. 索引
目录 索引 概述 结构 B-Tree B+Tree Hash 思考 分类 语法 SQL性能分析 SQL执行频率 慢查询日志 profile详情 explain执行计划 索引失效情况 范围查询 索引列运 ...
- 【Visual Studio 使用技巧分享】任务列表的使用
前言 Visual Studio 开发工具的熟练使用,能够潜在的提升我们工作效率,而且一些开发技巧的使用,会让我们的工作显得那么方便快捷.那么你知道VS中有哪些你不知道的使用小技巧呢?接下来,我们就来 ...