二分搜索算法分析

news2024/11/18 20:02:42

目录

时间复杂度

空间复杂度

注意

二分搜索代码归纳


时间复杂度

怎么计算二分查找算法的时间复杂度呢?如果用T (n )来表示n 个有序元素的二分查找算法的时间复杂度,那么结果如下。

• 当n =1时,需要一次做比较,T (n )=O (1)。

• 当n >1时,将待查找元素和中间位置元素做比较,需要O (1)时间,如果比较不成功,那么需要在前半部分或后半部分搜索,问题的规模缩小了一半,时间复杂度变为T (n /2)。


• 当n >1时,可以递推求解如下:


递推最终的规模为1,令n =2 x ,则x =log n 。


二分查找的非递归算法和递归算法查找的方法是一样的,时间复杂度相同,均为O (logn )。

空间复杂度

在二分查找的非递归算法中,变量占用了一些辅助空间,这些辅助空间都是常数阶的,因此空间复杂度为O (1)。

二分查找的递归算法,除了使用一些变量,还需要使用栈来实现递归调用。在递归算法中,每一次递归调用都需要一个栈空间存储,我们只需看看有多少次调用即可。假设原问题的规模为n ,首先第1次递归就分为两个规模为n /2的子问题,这两个子问题并不是每个都执行,只会执行其中之一,因为与中间值做比较后,要么在前半部分查找,要么在后半部分查找;然后把规模为n /2的子问题继续划分为两个规模为n /4的子问题,选择其一;继续分治下去,在最坏情况会分治到只剩下一个数值,那么算法执行的节点数就是从树根到叶子所经过的节点,每一层执行一个,直到最后一层,如下图所示。

递归调用最终的规模为1,即n /2 x =1,则x =logn 。假设阴影部分是搜索经过的路径,一共经过了logn 个节点,也就是说递归调用了logn 次。递归算法使用的栈空间为递归树的深度,因此二分查找递归算法的空间复杂度为O (logn )。

注意

在二分搜索中需要注意以下几个问题。

(1)必须满足有序性。

(2)搜索范围。初始时,需要指定搜索范围,如果不知道具体范围,则对正数可以采用范围[0,inf],对负数可以采用范围[-inf,inf],inf为无穷大,通常设定为0x3f3f3f3f。

(3)二分搜索。在一般情况下,mid=(l +r )/2或mid=(l +r )>>1。如果l 和r 特别大,则为了避免l +r 溢出,可以采用mid=l +(r -l )/2。对判断二分搜索结束的条件,以及判断mid可行时是在前半部分搜索,还是在后半部分搜索,需要具体问题具体分析。

(4)答案是什么。在减少搜索范围时,要特别注意是否漏掉了mid点上的答案。

二分搜索分为整数上的二分搜索和实数上的二分搜索,大致过程如下。

二分搜索代码归纳

public class Main{
	static int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10 };
//	                   下标:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
	static int seek = 8;

	public static void main(String[] args) {
		// 大于某值的最小值
		System.out.println(dichotomy1(0, array.length));
		// 大于等于某值的最小值
		System.out.println(dichotomy2(0, array.length));
		// 小于某值的最大值
		System.out.println(dichotomy3(0, array.length));
		// 小于等于某值的最大值
		System.out.println(dichotomy4(0, array.length));
		// 实数二分
		System.out.println(dichotomy5(0, array.length));
	}

	// 大于某值的最小值
	static int dichotomy1(int left, int right) {
		while (left < right) {
			int mid = left + (right - left) / 2;
			if (array[mid] > seek) {
				right = mid;
			} else {
				left = mid + 1;
			}
		}
		return left;
	}

	// 大于等于某值的最小值
	static int dichotomy2(int left, int right) {
		while (left < right) {
			int mid = left + (right - left) / 2;
			if (array[mid] >= seek) {
				right = mid;
			} else {
				left = mid + 1;
			}
		}
		return left;
	}

	// 小于某值的最大值
	static int dichotomy3(int left, int right) {
		while (left < right) {
			int mid = left + (right - left + 1) / 2;
			if (array[mid] < seek) {
				left = mid;
			} else {
				right = mid - 1;
			}
		}
		return left;
	}

	// 小于等于某值的最大值
	static int dichotomy4(int left, int right) {
		while (right > left) {
			int mid = left + (right - left + 1) / 2;
			if (array[mid] <= seek) {
				left = mid;
			} else {
				right = mid - 1;
			}
		}
		return left;
	}

	// 实数二分
	static double dichotomy5(double left, double right) {
		while (right - left > 1e-6) {
			double mid = left + (right - left) / 2;
			if (mid * mid * mid <= 20) {
				left = mid;
			} else {
				right = mid;
			}
		}
		return left;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1498957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件&#xff0c;用于在 Windows 系统上定时执行各种任务&#xff0c;包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤&#xff1a; 步骤 1: 设置 P…

基于qt的图书管理系统----05其他优化

参考b站&#xff1a;视频连接 源码github&#xff1a;github 目录 1 优化借阅记录显示2 时间显示为年月日3 注册接口 1 优化借阅记录显示 现在只能显示部分信息&#xff0c;把接的书名和人的信息全部显示 在sql语句里替换为这一句即可实现查询相关联的所有信息 QString str…

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context

[React 进阶系列] React Context 案例学习&#xff1a;使用 TS 及 HOC 封装 Context 具体 context 的实现在这里&#xff1a;[React 进阶系列] React Context 案例学习&#xff1a;子组件内更新父组件的状态。 根据项目经验是这样的&#xff0c;自从换了 TS 之后&#xff0c;…

洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧

随着社会的进步和科技的发展&#xff0c;我们的生活幸福感与日俱增。为了让我们从琐碎中解脱出来&#xff0c;干洗店洗鞋店行业也日新月异。今天&#xff0c;我为大家推荐这款优秀的干洗店小程序系统&#xff0c;让您的洗衣洗鞋服务体验更上一层楼。 干洗店管理系统是一款专为洗…

解读电影级视频生成模型 MovieFactory

Diffusion Models视频生成-博客汇总 前言&#xff1a;MovieFactory是第一个全自动电影生成模型&#xff0c;可以根据用户输入的文本信息自动扩写剧本&#xff0c;并生成电影级视频。其中针对预训练的图像生成模型与视频模型之间的gap提出了微调方法非常值得借鉴。这篇博客详细解…

2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现&#xff1a; 近年来&#xff0c;我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的&#xff0c;因此对于这些情况我们应该…

服务器通过impitool设置BMC共享lan实现远程管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、NC-SI是什么&#xff1f;二、ipmitool是什么三、查看是否支持ipmi设备四、安装ipmitool五、开始配置1.查看网卡状态2.设置运行模式3.设置静态地址 六、验证…

【机器学习】包裹式特征选择之基于遗传算法的特征选择

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

u盘里文件损坏无法打开怎么恢复?这样操作更简单

U盘已经成为我们传输和存储数据的重要工具。然而有时候我们可能会遇到U盘里的文件损坏无法识别的情况&#xff0c;这无疑给我们的工作和学习带来了不小的困扰。 那么面对这种情况应该如何应对呢&#xff1f;本文将为你介绍个实用的恢复方法&#xff0c;帮助你轻松解决U盘文件损…

排序算法:插入排序和希尔排序

一、插入排序 1.基本原理 插入排序&#xff08;英语&#xff1a;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上…

ResponseStatusException

目录 概述&#xff1a; 综合实例&#xff1a; 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…

嵌入式培训3-7

1.在主函数定义字符数组&#xff0c;在自定义函数中实现字符串比较 int strcmp(char *s1, char *s2); 参数&#xff1a;两个字符串 返回值&#xff1a;s1-s2差 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

一、前言 为什么需要判断视频文件是否含有B帧&#xff0c;这个在推流的时候很容易遇到这个问题&#xff0c;一般来说&#xff0c;没有B帧的视频文件&#xff0c;解码后的数据帧pts和dts都是顺序递增的&#xff0c;而有B帧的则未必&#xff0c;可能有些需要先解码后面显示&…

CentOS上安装MySQL 5.7和MySQL 8.0教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

全天候购药系统(微信小程序+web后台管理)

PurchaseApplet 全天候购药系统&#xff08;微信小程序web后台管理&#xff09; 传统线下购药方式存在无法全天候向用户提供购药服务&#xff0c;无法随时提供诊疗服务等问题。为此&#xff0c;运用软件工程开发规范&#xff0c;充分调研建立需求模型&#xff0c;编写开发文档…

智慧城市的前景:数字孪生技术在智慧城市中的应用前景

目录 一、引言 二、数字孪生技术及其在智慧城市中的应用概述 三、数字孪生技术在智慧城市中的应用前景 1、城市规划与仿真模拟 2、智能交通与出行服务 3、智慧环保与可持续发展 4、智慧公共服务与社会治理 5、智慧能源与绿色建筑 四、数字孪生技术在智慧城市中的挑战与…

稀疏数组实现

博文主要是自己学习的笔记&#xff0c;供自己以后复习使用&#xff0c; 参考的主要教程是B站的 尚硅谷数据结构和算法 稀疏数组(sparse array) 实际需求&#xff1a;五子棋程序中的存盘退出和续上盘的功能 问题分析&#xff1a; 如果直接用二维数组&#xff0c;很多值是默认…

hfish蜜罐搭建与使用

本次是对自己在学习蓝队过程中的一次对安全设备 hfish蜜罐的搭建和使用考核记录,距离之前已 经过去很久了,对之前在考核过程中的操作进行回顾和总结. 蜜罐在这里我进行免费分享 hfish-3.1.4-windows-amd64.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云…

Java工作需求后端代码--实现树形结构

加油&#xff0c;新时代打工人&#xff01; 前端页面 带树形结构的表格 最近在新项目上加班加点&#xff0c;下面是个实现树形结构的数据表格。 需求&#xff1a; 在前端页面表格中展示成树形结构的数据。 技术&#xff1a; 后端&#xff1a;Java、Mybatis-Plus、HuTool树形的…