二分查找(递归和迭代)– Python

1. 使用递归进行二分查找的 Python 程序

创建一个递归函数,并将搜索空间的 mid 与 key 进行比较。根据结果,要么返回找到键的索引,要么调用下一个搜索空间的递归函数。

# 用于递归二进制搜索的 Python 3 程序。
# 在注释中可以找到对旧版 Python 2 所需的修改。# 如果存在,则返回 arr 中 x 的索引,否则返回 -1
def binary_search(arr, low, high, x):# Check base caseif high >= low:mid = (high + low) // 2# 如果元素本身存在于中间if arr[mid] == x:return mid# 如果元素小于中间值,则它只能出现在左子数组中elif arr[mid] > x:return binary_search(arr, low, mid - 1, x)# 否则该元素只能出现在右子数组中else:return binary_search(arr, mid + 1, high, x)else:# 元素不在数组中return -1# Test array
arr = [ 2, 3, 4, 10, 40 ]
x = 10# Function call
result = binary_search(arr, 0, len(arr)-1, x)if result != -1:print("元素存在于索引", str(result))
else:print("数组中不存在元素")


输出

元素位于索引 3

时间复杂度:O(log n)

辅助空格:O(logn) [注意:递归创建调用堆栈]

2. 使用迭代进行二分查找的 Python 程序

这里我们使用 while 循环来继续比较键并将搜索空间分成两半的过程。

# 迭代二分搜索函数
# 如果存在,则返回给定数组 arr 中 x 的索引,
# 否则返回 -1
def binary_search(arr, x):low = 0high = len(arr) - 1mid = 0while low <= high:mid = (high + low) // 2# 如果 x 更大,则忽略左半部分if arr[mid] < x:low = mid + 1# 如果 x 较小,则忽略右半部分elif arr[mid] > x:high = mid - 1# 表示 x 出现在中间else:return mid# 如果我们到达这里,则该元素不存在return -1# 测试数组
arr = [ 2, 3, 4, 10, 40 ]
x = 10# 函数调用
result = binary_search(arr, x)if result != -1:print("元素存在于索引", str(result))
else:print("数组中不存在元素")


输出

元素位于索引 3

时间复杂度:O(log n)

辅助空间:O(1)

3. 使用内置的 bisect 模块进行二分查找的 Python 程序

分步方法:

  • 代码导入 bisect 模块,该模块提供对二分查找的支持。
  • 定义binary_search_bisect() 函数的定义是将数组 arr 和要搜索的元素 x 作为输入。
  • 该函数调用 bisect 模块的 bisect_left() 函数,该函数查找元素在排序数组 arr 中的位置,其中应插入 x 以保持排序顺序。如果元素已存在于数组中,则此函数将返回其位置。
  • 然后,该函数检查返回的索引 i 是否在数组范围内,以及该索引处的元素是否等于 x。
  • 如果条件为 true,则函数返回索引 i 作为元素在数组中的位置。
  • 如果条件为 false,则函数返回 -1,指示数组中不存在该元素。
  • 然后,该代码定义一个数组 arr 和一个要搜索的元素 x。
  • 调用 binary_search_bisect() 函数时,将 arr 和 x 作为输入,返回的结果存储在 result 变量中。
  • 然后,代码检查结果是否不等于 -1,这表示该元素存在于数组中。如果为 true,则打印元素在数组中的位置。
  • 如果结果等于 -1,则代码将打印一条消息,指出该元素不存在于数组中。
import bisectdef binary_search_bisect(arr, x):i = bisect.bisect_left(arr, x)if i != len(arr) and arr[i] == x:return ielse:return -1# Test array
arr = [2, 3, 4, 10, 40]
x = 10# 测试数组
result = binary_search_bisect(arr, x)if result != -1:print("元素存在于索引", str(result))
else:print("数组中不存在元素")


输出

元素位于索引 3

时间复杂度:O(log n)

辅助空间:O(1)

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

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

相关文章

电力场景绝缘子缺陷分割数据集labelme格式1585张4类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1585 标注数量(json文件个数)&#xff1a;1585 标注类别数&#xff1a;4 标注类别名称:["broken part","broken insulat…

部署说明书

一、打开IIS功能 1、 双击“此电脑” 2、 在空白地方右键后&#xff0c;点击属性 3、 点击控制面板主页 4、 查看方式选择小图标&#xff0c;然后点击”程序和功能” 5、点击”启用或关闭Windows功能” 6、 勾选”Internet Information Services”勾选“IIS管理服务…

在vue2项目中el-table表格的表头和内容错位问题

一、问题描述以及产生原因 问题描述&#xff1a;当el-table表格有横向滚动条和纵向滚动条&#xff0c;把横向滚动条拉到最右边&#xff0c;表格的表头会和内容错位&#xff08;表头和内容列不对齐&#xff09;问题产生原因&#xff1a;在el-table有纵向滚动条时&#xff0c;el…

《基于深度学习的图像修复技术研究与应用-图像修复》—3000字论文模板

摘要(500字) (扩展方向:补充具体技术指标与创新点量化描述) 本文针对图像修复技术展开研究,重点探讨了基于深度学习的方法在图像修复领域的应用。研究首先回顾了传统图像修复技术,随后深入分析了深度学习在图像修复中的优势。本文提出了一种改进的深度学习图像修复模型…

基于Python+Vue的智能服装商城管理系统的设计与实现

&#x1f457; 基于PythonVue的智能服装商城管理系统的设计与实现 电商级解决方案&#xff1a;全栈技术融合 智能推荐系统 多维度数据分析 项目亮点&#xff1a;课程设计优选 | 企业级架构规范 | 完整电商功能闭环 | 毕业设计选择 &#x1f310; 在线资源速览 类别地址访问方…

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…

使用vue3.0+electron搭建桌面应用并打包exe

使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客

linux如何判断进程对磁盘是随机写入还是顺序写入?

模拟工具&性能测试工具&#xff1a;fio fio参数说明&#xff1a; filename/dev/sdb1&#xff1a;测试文件名称&#xff0c;通常选择需要测试的盘的data目录。 direct1&#xff1a;是否使用directIO&#xff0c;测试过程绕过OS自带的buffer&#xff0c;使测试磁盘的结果更真…

STM32基础教程——对射式红外传感器计数实验

前言 对射式红外传感器介绍 对射式红外传感器是一种非接触式的距离检测器&#xff0c;主要由发射器和接收器两部分组成。发射器发出特定波长的红外光束&#xff0c;当物体阻挡了这条光束时&#xff0c;接收器无法接收到光线信号&#xff0c;从而产生一个开关信号来判断物体的存…

Hive-优化(语法优化篇)

列裁剪与分区裁剪 在生产环境中&#xff0c;会面临列很多或者数据量很大时&#xff0c;如果使用select * 或者不指定分区进行全列或者全表扫描时效率很低。Hive在读取数据时&#xff0c;可以只读取查询中所需要的列&#xff0c;忽视其他的列&#xff0c;这样做可以节省读取开销…

rkipc控制ircut的分析

rk_isp_set_night_to_day函数 rkipc控制ircut主要通过rk_isp_set_night_to_day函数&#xff0c;例如在ser_rk_isp_set_night_to_day函数中 int ser_rk_isp_set_night_to_day(int fd) {int ret 0;int id, len;char *value NULL;if (sock_read(fd, &id, sizeof(id)) SOC…

Android Retrofit + RxJava + OkHttp 网络请求高效封装方案

Retrofit RxJava OkHttp 是 Android 开发中常用的网络请求库组合。Retrofit 是一个类型安全的 HTTP 客户端&#xff0c;RxJava 是一个响应式编程库&#xff0c;OkHttp 是一个高效的 HTTP 客户端。 Retrofit RxJava OkHttp 的组合可以提供以下功能&#xff1a; 职责清晰 R…

【nRF52832】【Nodic】开发入门【三】模块化

title: nRF52832开发入门【二】模块化 tags: nodic categories: nodic abbrlink: 37752 date: 2025-03-09 17:22:17 1. 介绍 我们实际开发过程中往往会很复杂&#xff0c;为了更好的管理代码&#xff0c;我们需要模块化。模块化的好处有很多&#xff0c;比如&#xff1a; 降…

爬虫案例八js逆向爬取网易音乐

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、js逆向的前期准备二、网站分析三、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬取网易音乐 提示&#xff1a;以下是本篇…

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时&#xff0c;如何每个组件都去import导入组件&#xff0c;大大降低了开发效率&#xff0c;如果全局一次性注册会增加项目体积&#xff0c;那么如何实现既不局部引入&#xff0c;也不全局注册&#xff1f; 2.在element-plus官网看到有说明…

【Andrej Karpathy 神经网络从Zero到Hero】--2.语言模型的两种实现方式 (Bigram 和 神经网络)

目录 统计 Bigram 语言模型质量评价方法 神经网络语言模型 【系列笔记】 【Andrej Karpathy 神经网络从Zero到Hero】–1. 自动微分autograd实践要点 本文主要参考 大神Andrej Karpathy 大模型讲座 | 构建makemore 系列之一&#xff1a;讲解语言建模的明确入门&#xff0c;演示…

(二 十 二)趣学设计模式 之 备忘录模式!

目录 一、 啥是备忘录模式&#xff1f;二、 为什么要用备忘录模式&#xff1f;三、 备忘录模式的实现方式四、 备忘录模式的优缺点五、 备忘录模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…

安装SPSS后启动显示应用程序无法启动,因为应用程序的并行配置不正确的解决方案

软件安装报错问题有需要远程文章末尾获取联系方式&#xff0c;可以帮你远程处理各类安装报错。 一、安装SPSS后启动显示应用程序无法启动&#xff0c;因为应用程序的并行配置不正确报错 在成功安装 SPSS 软件后&#xff0c;尝试启动应用程序时&#xff0c;系统弹出错误提示窗…

IP,MAC,ARP 笔记

1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字&#xff0c;比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此&#xff0c;完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;条件变量&#xff08;std::condition_variable&#xff09;是线程同步机制之一&#xff0c;用于在多线程环境中实现线程间的通信和协调。它允许一个或多个线程在某个条件尚未满足时等待&#xff0c;直到其他线程通知条件已经满足…