二分法查找是什么意思

引入:

二分法思想无处不在,我们经常玩的猜数字游戏,0-99的范围,最多需要多少次我就可以猜对呢?

使用二分法思想,最多仅仅需要7次就可以查找到。

二分法查找是非常恐怖的,以2的倍数缩小范围。所以时间复杂度O(logn)

局限性:

1.针对二分法查找的数据必须是有序的。

2.二分法查找依赖于顺序表结构,也就是数组。因为二分法需要随机访问元素,也就是O(1)的复杂度找到对象,所以需要内存连续。如果使用链表,那么时间复杂度就会变得非常高

3.适合静态数据,不适合频繁的插入和删除操作的数据所以当数据比较静态,没有频繁的插入和删除的操作的时候,可以先对数据进行排序,排序时间复杂度最低O(nlogn)

例子:

求一个数的平方根,可以指定精度。

从二分法的思想就是不断的范围缩减,所以代码实现上可以有通过递归的方式和非递归的方式实现。

class Program { static void Main(string args) { var data = GetSS(4, 0.00000001); Console.WriteLine(data*data); } /// <summary> /// 获取平方根 /// </summary> /// <param name="input">输入值</param> /// <param name="jd">精度</param> /// <returns></returns> public static double GetSS(double input, double jd) { double low = 0; double high = input; double middle = low + (high - low) / 2; while ((high - low) > jd) { if (input > middle * middle) { low = middle; } else { high = middle; } middle = low + (high - low)/2; Console.WriteLine(high - low); } return middle; } }

问题深入

二分法查找是什么意思

上面的使用二分法查找都是最简单的情况,也就是数据不存在重复的情况下,但是数据如果存在重复的情况下,会出现其他的变种的需求;

(1)查找第一个元素等于给定值的元素

static void Main(string args) { var a = new { 1,2,8,8,8,8,8,8,11,13,18}; Console.WriteLine(GetValue(a, a.Length,8)); } public static int GetValue(int a,int n ,int value) { var low = 0; var high = n - 1; while (low <= high) { int middle = low + ((high - low) >> 1); if (a > value) {//因为不包含等于,可以多递增一个数 high = middle-1; } else if (a < value) { low =middle+1; } else { if (middle == 0 || a[middle - 1] != value) { return middle; } else { //因为是查找第一个所以将high赋值middle-1 high = middle-1; } } } return -1; }

上面的代码就是当a=value的时候,需要判断一下middle-1的值是否是指定值。

(2)查找最后一个等于给定值的元素。

这个就比较简单了,只要在第一个的基础上稍作修改即可

public static int GetValue(int a, int n, int value) { var low = 0; var high = n - 1; while (low <= high) { int middle = low + ((high - low) >> 1); if (a > value) {//因为不包含等于,可以多递增一个数 high = middle - 1; } else if (a < value) { low = middle + 1; } else { if (middle == 0 || a[middle +1] != value) { return middle; } else { low = middle + 1; } } } return -1; }

(3)查找第一个大于等于给定值的元素

public static int GetValue(int a, int n, int value) { var low = 0; var high = n - 1; while (low <= high) { int middle = low + ((high - low) >> 1); if (a >= value) {//因为不包含等于,可以多递增一个数 if (middle == 0 || a[middle - 1] < value) { return middle; } else { high = middle - 1; } } else { low = middle + 1; } } return -1; }

(4)查找最后一个小于等于给定值的元素

public static int GetValue(int a, int n, int value) { var low = 0; var high = n - 1; while (low <= high) { int middle = low + ((high - low) >> 1); if (a > value) {//因为不包含等于,可以多递增一个数 high = middle - 1; } else { if (middle == 0 || a[middle + 1] > value) { return middle; } else { low = middle +1; } } } return -1; }

本文【二分法查找是什么意思】由作者: 自旋锁 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4284.html

(0)
上一篇 2023-03-12 08:12:24
下一篇 2023-03-12 08:37:19

相关推荐

  • 泛域名解析是指域名解析服务器,无法启动iisweb服务器

    一、ssl证书支持泛解析教程 1、进入DNS控制后台,鼠标右键点击rtj.n et,在弹出的对话框中,选择新建一个域名,然后在新建DNS域文本框中输入“*”,创建一个名为*的二级区域。最后点击确定。 一般这个区域DNS服务器是允许建立的,接着在.rtj.n et 区域中创建一个空主机名的记录。同上一个步骤一样,右键点击,在弹出对话框中选择新建主机,然后在名称…

    2023-03-14
    300
  • poi是什么意思

    对于我们咫尺同城圈的运营者来说,POI这个词一定不陌生,想要进行商品的添加,商家的入驻,都必须提到POI。 那么POI是什么,如何进行POI的认领,以及如何能快速的通过POI的商品审核呢?今天用这篇文章跟你们讲清楚! 一、POI是什么 POI是“Point of Interest”的缩写,意即兴趣点,可以简单理解为非地理意义的有意义的点,一个POI可以是一栋…

    2023-03-20
    000
  • sql数据库开发是什么,sql数据库常用命令

    SQL 是一种非常常见但功能强大的工具,它可以帮助从任何数据库中提取、转换和加载数据。 数据查询的本质在于SQL。 随着公司和组织发现自己处理的数据量迅速增加,开发人员越来越需要有效地使用数据库来处理这些数据。 所以想要深入数据领域,SQL是必须的! 要掌握这门语言,你需要知道如何使用一些命令——其中大部分命令都基于一些基本命令。 对于整篇文章,我使用的是一…

    2023-03-15
    600
  • 搭建web服务器

    前言: 这里以git bash 工具为例,当然你可以直接用puTTY或者Xshell链接到服务器,用FileZilla 上传文件。 一、连接服务器 ssh root@你的远程ip地址。 二、查看版本 uname -a 三、安装nginx(1) 这一步可以直接跳过,现在nginx可以直接yum install nginx安装,如果yum install ngi…

    2023-03-13
    400
  • 携程数据库工程师笔试多少分进面

    携程笔试时间在前几天公布啦!! 携程笔试时间为: 03月24日 同学们都有好好地准备吗?如果没有赶紧来看这篇速成秘籍!(喜欢记得点赞+收藏) 一、携程公司简介 携程是一个在线票务服务公司,创立于1999年,总部设在中国上海。携程旅行网拥有国内外六十余万家会员酒店可供预订,是中国领先的酒店预订服务中心。 携程旅行网已在北京、天津、广州、深圳、成都、杭州、厦门、…

    2023-03-12
    400
  • python编程软件哪个好用,python初学者用什么软件

    我们列出了 2022 年适用于 Linux 和 Windows 的六个最佳 Python 代码编辑器。 如今,Python无处不在,它可以说是现代版的 C 语言编程语言。从网站、应用程序、数据科学项目、人工智能到物联网设备,你可以发现 Python 无处不在。因此,作为这十年来流行的编程语言,了解 Python 的开发环境是很有必要的,开发人员用它创建应用程…

    2023-03-18
    100
  • php云系统 验证码客户端回显

    一,介绍 1.1 验证码漏洞 顾名思义,验证码漏洞就是验证码本身存在问题,或者是与验证码相关的内容存在问题。 1.2 验证码作用 客户端发起请求-> 服务端响应并创建一个新的 SessionID 同时生成随机验证码,将验证码和 SessionID 一并返回给客户端-> 客户端提交验证码连同 SessionID 给服务端-> 服务端验证验证码…

    2023-03-21
    000
  • 动态链接库dll初始化失败怎么弄

    首先在本机上安装了solid works软件,打开出现这样的情况,可以尝试重新启动在打开,还是没有效果的话不要慌张,这样的小问题是可以解决的! 不管是重启还是修复等一系列解决方法都没有解决的话,不妨试试我的解决方法吧! 不敢保证每个人都可以解决类似问题,但本人就是这样解决的 好了,不废话了,看下面的解决方法吧! 1:打开i控制面板上的电源选项 2:进入到选择…

    2023-03-09
    500
  • linux系统基础入门教程

    一 Linux简介 Linux是基于Unix的开源免费的操作系统 由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境 Linux是由Linus Torvalds(林纳斯 托瓦兹) 起初开发的 由于源代码的开放性 现在已经衍生出了成千上百种不同的Linux系统 最最最常见的发行版本是CentOS 二 Linux目录结构 三 Linux基本命令 1. 目…

    2023-03-12
    200
  • html表单get和post的区别_html表单提交按钮

    我们在Web表单提交,常常需要选择提交方法,这时我们会用到GET和POST方法。但关于它们之间的区别你又知道多少。今天我们就来了解它们 这两方法其实是HTTP协议中的请求方法(关于HTTP协议可以阅读之前我写的《解密Web通信协议——超文本传输协议》)我们先通过一个例子来看看它们之间的区别。 通过下面源代码来查看: 我们来看一下地址栏无输入时为: file:…

    2023-03-11
    500

发表回复

登录后才能评论
返回顶部
错说博客上线啦!