bisect_left 和 bisect_right 的源码实现及区别解析

哈喽大家好,我是chowley,最近再练二分查找的题,也顺便看了看Python官方的bisect库,这次做一个总结博客。

在 Python 中,bisect_leftbisect_right 是两个常用的二分查找函数,用于在已排序的序列中查找元素应该插入的位置。本文将给出它们的源码实现,并解析它们的区别和使用场景。

1. bisect_left 函数源码及解析

def bisect_left(a, x, lo=0, hi=None):if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)while lo < hi:mid = (lo + hi) // 2if a[mid] < x:lo = mid + 1else:hi = midreturn lo

  • 功能:在已排序序列 a 中查找元素 x 应该插入的位置,并返回最左侧的插入位置。
  • 区别:如果有多个相同元素,bisect_left 返回最左侧的插入位置。

2. bisect_right 函数源码及解析

def bisect_right(a, x, lo=0, hi=None):if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)while lo < hi:mid = (lo + hi) // 2if x < a[mid]:hi = midelse:lo = mid + 1return lo

  • 功能:在已排序序列 a 中查找元素 x 应该插入的位置,并返回最右侧的插入位置。
  • 区别:如果有多个相同元素,bisect_right 返回最右侧的插入位置。

3. 区别和使用场景

  • 区别:主要区别在于对相同元素的处理,bisect_left 返回最左侧的插入位置,而 bisect_right 返回最右侧的插入位置。
  • 使用场景:如果需要查找元素在序列中的最左侧位置,可以使用 bisect_left;如果需要查找元素在序列中的最右侧位置,可以使用 bisect_right

这么说可能有点蒙蔽,我画一个图你就懂了

在目标元素数量小于等于1时,两者没有区别;

当目标元素多次出现时:

IDE运行结果如下:

总结

通过以上对 bisect_leftbisect_right 函数的源码实现及区别解析,我们可以更好地理解和使用这两个函数,在实际应用中更加灵活地处理已排序序列。

好了,以上就是本文的全部内容,如有问题可留言讨论。

本人正在组建校招测试开发方向的交流社区,如果您对测试求职方面感兴趣,欢迎加入了解。

我是chowley,一个专注互联网技术和产品质量保障领域的博主,我们下次再见!

欢迎点赞、评论、收藏,it's important for me.

Searching for QALog.

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

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

相关文章

鸿蒙LiteOS-M 内核初始化

目录 一、LiteOS-M 初始化内核二、LOS_KernelInit代码分析三、LOS_Start代码解析坚持就有收获 一、LiteOS-M 初始化内核 在LiteOS-M应用程序中&#xff0c;系统初始化如下&#xff1a; /*** brief This is the ohos entry, and you could call this in your main funciton af…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

【群智能算法转让】一种新的群智能算法||一种超越隐喻的元启发算法||一种基于数学的群智能算法

1、简介 本次全新出推出一个新的基于种群的元启发算法&#xff0c;基于数学中求解非线性方程组的基本思想而开发的&#xff0c;性能不错 新算法转让Q1 top级&#xff08;一种基于数学的超越隐喻的元启发式算法&#xff09; 新的群智能算法转让&#xff0c;新的元启发式算法转…

花生壳内网穿透教程(图文并茂)

目录 前言&#xff1a; 使用教程&#xff1a; 1.注册账号 2.软件下载及安装&#xff1a; 3.账号绑定及花生壳的使用 4.内网穿透的配置&#xff08;重点&#xff09; 4.2 新增映射页面&#xff1a; 4.3 上面几种映射的区别&#xff1a; 4.4 上面TCP类型的区别&#xff1a;…

LangChain原理学习笔记

最新越发觉得AI的发展&#xff0c;对未来是一场革命&#xff0c;LangChain已经在工程设计上有了最佳实践&#xff0c;类似于AI时代的编程模型或编程框架&#xff0c;有点Spring框架的意思。之前在LangChain上也有些最佳实践&#xff0c;所以在这里分享记录下。 LangChain解决什…

万字干货-京东零售数据资产能力升级与实践

开篇 京东自营和商家自运营模式&#xff0c;以及伴随的多种运营视角、多种组合计算、多种销售属性等数据维度&#xff0c;相较于行业同等量级&#xff0c;数据处理的难度与复杂度都显著增加。如何从海量的数据模型与数据指标中提升检索数据的效率&#xff0c;降低数据存算的成…

【Django开发】0到1开发美多shop项目:Celery短信和用户注册。全md文档笔记(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

试用nebulagraph

按照手册的快速入门&#xff0c;本地部署操作&#xff0c;基本没什么问题。有一些注意事项NebulaGraph Database 手册 (nebula-graph.com.cn) 默认安装路径在/usr/local/nebula ip的问题 在步骤3的时候 $ ./nebula-console -addr <ip> -port <port> -u <use…

一文带你解决如何设置Redis临时密码和永久密码

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 一文带你解决如何设置Redis临时密码和永久密码 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&…

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结&#xff1a; 一、引言 ​ 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

超平面介绍

超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中&#xff0c;一条直线是一维的&#xff0c;它把平面分成了两部分&#xff1b;三维空间中&#xff0c;一个平面是二维的&#xff0c;它把空间分成了两部分。(2…

高级RAG:使用RAGAs + LlamaIndex进行RAG评估,包括原理、图和代码

原文地址&#xff1a;Using RAGAs LlamaIndex for RAG evaluation 2024 年 2 月 5 日 如果您已经为实际的业务系统开发了检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;应用程序&#xff0c;那么您可能会关心它的有效性。换句话说&#xff0c;您…