二分搜索法

定义

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。

适用范围

当数据量很大并且有序时,适宜采用该方法。

基本思想

假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,

如果当前位置arr[k] 值等于key,则查找成功;

若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low, mid - 1];

若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid + 1, high],

直到找到为止,时间复杂度:O(log(n))

算法难点

对边界条件细节掌握,也就是区间状态。区间状态基本为下边两种。

若是区间为[left, right]既while(left<=arr.Length-):更新状态方式left = mid + 1; right = mid - 1;

若是区间为[left, right)既while(left<arr.Length):更新状态方式left = mid + 1; right = mid;

代码实现(模板)

该代码是实现区间为[left,right]的。

public static int BinarySearch(int[] nums, int target)
{
// 避免当 target不存在与数组,多次进行循环运算
if (target < nums[0] || target > nums[nums.Length - 1])
{
return -1;
}
int left = 0, right = nums.Length - 1;
while (left <= right)
{
//1.此处避免数据量过大,超出int范围。2.位运算效率比较高
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
}
return -1;
}

题目练习

给出的题目由易到难,熟练掌握二分法,及其边界处理问题。

704. 二分查找

//这道题是最简单的,也是我们二分法的模板。之后关于二分法的题目,都是基于此题给的变形。
public int Search(int[] nums, int target) {
int left = 0;
int right = nums.Length - 1;
int mid = 0;
while (left <= right)
{
mid = left + ((right - left)>>1);
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}

153. 寻找旋转排序数组中的最小值

public int FindMin(int[] nums)
{
int left = 0;
int right = nums.Length - 1;
int mid;
while (left <= right)
{
mid = left + ((right - left) >> 1);
// 注意是当中值大于等于右值时,
if (nums[mid] >= nums[right])
{
left = mid + 1;
}
else
{
right = mid;
}
}
return nums[right];
}

面试题 10.03. 搜索旋转数组

public int Search(int[] arr, int target)
{
if (arr[0]==target) return 0;
int left = 0;
int right = arr.Length - 1;
int mid;
while (left <= right)
{
mid = left + (right - left)>>1;
if (arr[mid] == target)
{
while (mid > 1 && arr[mid - 1] == arr[mid])
{
mid--;
}
return mid;
}
else if (arr[mid] > arr[left])//左侧递增
{
if (arr[left] <= target && target < arr[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
} }
else if (arr[mid] < arr[left])
{
if (arr[mid] < target && target <= arr[right])
{
left = mid + 1;
}
else
{
right = mid - 1;
} }
else {
left++;
}
}
return -1;
}

题库:二分查找分类练习

C#.NET实现二分查找的更多相关文章

  1. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  2. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  3. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  4. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  5. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  6. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

  7. 【Python】二分查找算法

    二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...

  8. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  9. java二分查找举例讨论

    最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...

  10. JAVA源码走读(二)二分查找与Arrays类

    给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...

随机推荐

  1. 第九十三篇:ESLint:可组装的javaScript和JSX检查工具

    好家伙, 1.什么是ESLint? 代码检查工具,用来检查你的代码是否符合指定的规范 2.ESLint有什么用? 统一JavaScript代码风格的工具 在合作开发的时候, 每个成员的代码风格都有可能 ...

  2. C语言:多功能计算器程序说明书

    好家伙,3000字终于写完了 一.题目:多功能科学计算器 二.内容: (1)概述或引言 开发环境为Visual C++ 目前已实现的功能: (1)解二元一次方程.一元二次方程 (2)进行矩阵相加.相减 ...

  3. 后缀自动机(SAM)+广义后缀自动机(GSA)

    经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...

  4. Windows服务器的重复数据删除功能

    自从Windows server 2012开始,微软在系统层面提供了重复数据删除功能.重复数据删除是为了文件服务器.虚拟化服务器等设计的.其实只要是存放的文件有大部分内容是相同的就可以发挥很好的效果. ...

  5. Elasitcsearch7.X集群/索引备份与恢复实战

    文章转载自:https://mp.weixin.qq.com/s/_0RlojDsE30CeDSyLNP44w 1.问题引出 ES中文社区中,有如下问题: 问题1:存储数据,data目录从一个机器直接 ...

  6. kubeoperator 使用外部mysql

    1.导出 kubeoperator 的数据库 sql 文件,然后导入到外部mysql 2.正常关闭 kubeoperator 3.关闭 kubeoperator 不会影响已经部署的 k8s 集群 4. ...

  7. 二叉树及其三种遍历方式的实现(基于Java)

    二叉树概念: 二叉树是每个节点的度均不超过2的有序树,因此二叉树中每个节点的孩子只能是0,1或者2个,并且每个孩子都有左右之分. 位于左边的孩子称为左孩子,位于右边的孩子成为右孩子:以左孩子为根节点的 ...

  8. 右击存放项目的文件夹出现 open with Visual Studio Code 的打开方式

    最终效果 步骤1: 找到 Visual Studio Code 的安装位置 (右击桌面Visual Studio Code 图标-->属性-->打开文件夹所在位置) 新建一个可以编辑的 c ...

  9. 基于纯前端类Excel表格控件实现在线损益表应用

    财务报表也称对外会计报表,是会计主体对外提供的反映企业或预算单位一定时期资金.利润状况的会计报表,由资产负债表.损益表.现金流量表或财务状况变动表.附表和附注构成.财务报表是财务报告的主要部分,不包括 ...

  10. 论文解读(GGD)《Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with Group Discrimination》

    论文信息 论文标题:Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with ...