Python 二分查找:bisect库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
本文目录
- 简介
- bisect 库的使用
- bisect_left
- bisect_right
- insort_left
- insort_right
- 二分查找基础实现
简介
bisect 库是 Python 标准库中的一部分,它提供了二分查找的功能。二分查找是一种在有序列表中查找某一特定元素的搜索算法。它的时间复杂度为 O(logn)O(\log n)O(logn),比顺序查找的时间复杂度 O(n)O(n)O(n) 要有效率。
bisect 库的使用
bisect 库提供了 bisect_left、bisect_right、insort_left、insort_right四个函数,用于在有序列表中查找或插入元素。
bisect_left
bisect_left 函数用于在有序列表中二分查找某一位置,使得在该位置插入指定元素后仍保持有序,返回该位置,如果元素已经存在,则返回它的左边位置。
函数原型如下:
bisect.bisect_left(a, x, lo=0, hi=len(a), *, key=None)
其中,a 是一个有序列表,x 是要查找的元素,lo 和 hi 是查找范围的左右边界,key 是一个函数,用于从列表中提取比较的键值。
示例:
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 查找元素 4 的位置
print(bisect.bisect_left(a, 4)) # 4
# 查找元素 6 的位置
print(bisect.bisect_left(a, 6)) # 5
bisect_right
bisect_right 函数用于在有序列表中二分查找某一位置,使得在该位置插入指定元素后仍保持有序,返回该位置,如果元素已经存在,则返回它的右边位置。
函数原型如下:
bisect.bisect_right(a, x, lo=0, hi=len(a), *, key=None)
其中,a 是一个有序列表,x 是要查找的元素,lo 和 hi 是查找范围的左右边界,key 是一个函数,用于从列表中提取比较的键值。
示例:
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 查找元素 4 的位置
print(bisect.bisect_right(a, 4)) # 4
# 查找元素 6 的位置
print(bisect.bisect_right(a, 6)) # 8
除此之外,bisect_right 还可以简写为 bisect :
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 查找元素 4 的位置
print(bisect.bisect(a, 4)) # 4
# 查找元素 6 的位置
print(bisect.bisect(a, 6)) # 8
insort_left
insort_left 函数用于在有序列表中二分查找某一位置,使得在该位置插入指定元素后仍保持有序,然后将元素插入该位置,如果元素已经存在,则插入到它的左边位置。
函数原型如下:
bisect.insort_left(a, x, lo=0, hi=len(a), *, key=None)
其中,a 是一个有序列表,x 是要插入的元素,lo 和 hi 是查找范围的左右边界,key 是一个函数,用于从列表中提取比较的键值。
示例:
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 插入元素 4
bisect.insort_left(a, 4)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10]
# 插入元素 6
bisect.insort_left(a, 6)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
insort_right
insort_right 函数用于在有序列表中二分查找某一位置,使得在该位置插入指定元素后仍保持有序,然后将元素插入该位置,如果元素已经存在,则插入到它的右边位置。
函数原型如下:
bisect.insort_right(a, x, lo=0, hi=len(a), *, key=None)
其中,a 是一个有序列表,x 是要插入的元素,lo 和 hi 是查找范围的左右边界,key 是一个函数,用于从列表中提取比较的键值。
示例:
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 插入元素 4
bisect.insort_right(a, 4)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10]
# 插入元素 6
bisect.insort_right(a, 6)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
除此之外,insort_right 还可以简写为 insort :
# 导入 bisect 库
import bisect
# 有序列表
a = [1, 2, 3, 3, 5, 6, 6, 6, 8, 10]
# 插入元素 4
bisect.insort(a, 4)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 8, 10]
# 插入元素 6
bisect.insort(a, 6)
print(a) # [1, 2, 3, 3, 4, 5, 6, 6, 6, 6, 8, 10]
insort 函数的实质是调用 bisect 函数获取插入位置,然后调用 list.insert 函数将元素插入到该位置。
二分查找基础实现
在 Python 中,我们可以使用 bisect 库来实现二分查找,但其只能根据元素的值和元素之间的比较关系来查找元素的位置,如果要根据元素的其他属性或其他关系来查找元素的位置,就需要自己实现二分查找了。
二分查找的基本模板如下:
def binary_search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return -1
通过修改模板,我们可以根据更复杂的关系来查找元素。
示例:
852. 山脉数组的峰顶索引
符合下列属性的数组arr称为 山脉数组 :
arr.length >= 3- 存在
i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]arr[i] > arr[i+1] > ... > arr[arr.length - 1]给你由整数组成的山脉数组
arr,返回任何满足arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]的下标i。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/peak-index-in-a-mountain-array
解
class Solution:def peakIndexInMountainArray(self, arr: List[int]) -> int:n = len(arr)left, right, ans = 1, n - 2, 0while left <= right:mid = (left + right) // 2if arr[mid] > arr[mid + 1]:ans = midright = mid - 1else:left = mid + 1return ans
相关文章:
Python 二分查找:bisect库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
性能优化之HBase性能调优
HBase是Hadoop生态系统中的一个组件,是一个分布式、面向列存储的内存型开源数据库,可以支持数百万列(MySQL4张表在HBase中对应1个表,4个列)、超过10亿行的数据存储。可用作:冷热数据分离HBase适合作为冷数据…...
图像金字塔,原理、实现及应用
什么是图像金字塔 图像金字塔是对图像的一种多尺度表达,将各个尺度的图像按照分辨率从小到大,依次从上到下排列,就会形成类似金字塔的结构,因此称为图像金字塔。 常见的图像金字塔有两类,一种是高斯金字塔࿰…...
08-Oracle游标管理(定义,打开、获取数据及关闭游标)
目标 1.确定何时需要显示游标2.声明、打开和关闭显示游标3.从显示游标中提取数据4.了解与游标有关的属性5.使用游标FOR循环检索游标中的数据6.在游标FOR循环的子查询中声明游标7.评估使用逻辑运算符结合在一起的布尔条件游标 1、在使用一个PL/SQL块来执行DML语句或只返回一行结…...
Python判断字符串是否包含特定子串的7种方法
目录1、使用 in 和 not in2、使用 find 方法3、使用 index 方法4、使用 count 方法5、通过魔法方法6、借助 operator7、使用正则匹配转自:https://cloud.tencent.com/developer/article/1699719我们经常会遇这样一个需求:判断字符串中是否包含某个关键词…...
aop实现接口访问频率限制
引言 项目开发中我们有时会用到一些第三方付费的接口,这些接口的每次调用都会产生一些费用,有时会有别有用心之人恶意调用我们的接口,造成经济损失;或者有时需要对一些执行时间比较长的的接口进行频率限制,这里我就简…...
Hive---窗口函数
Hive窗口函数 其他函数: Hive—Hive函数 文章目录Hive窗口函数开窗数据准备建表导入数据聚合函数window子句LAG(col,n,default_val) 往前第 n 行数据LEAD(col,n, default_val) 往后第 n 行数据ROW_NUMBER() 会根据顺序计算RANK() 排序相同时会重复,总数不会变DENSE…...
JavaSe第7次笔记
1. C语言里面,NULL是0地址。Java中null和0地址没关系。 2.数组可以做方法的返回值。 3.可以使用变量作为数组的个数开辟空间。 4.断言assert,需要设置。 5.排序:Arrays. sort(array); 6.查找: int index Arrays. binarySea…...
什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有 什么区别,怎样停用 Service?
在 Service 的生命周期中,被回调的方法比 Activity 少一些,只有 onCreate, onStart, onDestroy, onBind 和 onUnbind。 通常有两种方式启动一个 Service,他们对 Service 生命周期的影响是不一样的。 1. 通过 startService Service 会经历 onCreate 到 onStart,然后处于运行…...
Redis部署
JAVA安装 mkdir /usr/local/javacd /usr/local/java/wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u13…...
AT32F437制作Bootloader然后实现Http OTA升级
首先创建一个AT32F437的工程,然后发现调试工程配置这里的型号和创建工程选的型号不一致,手动更改一下,使用PW Link下载程序的话还要配置一下pyocd.exe的路径。 打开drv_clk.c文件的调试功能看下系统时钟频率。 项目使用的是AT32F437VMT7芯片&…...
Springboot项目启动初始化数据缓存
1.从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解, PostConstruct和PreDestroy,这两个注解被用来修饰一个非静态的void()方法,被PostConstruct修饰的方法会在服务器加载Servlet的时候运…...
深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化
在深度学习中,第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴,数据集经常要用Voc格式的,比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化&…...
数据、数据资源及数据资产管理的区别
整理不易,转发请注明出处,请勿直接剽窃! 点赞、关注、不迷路! 摘要:数据、数据资源、数据资产 数据、数据资源及数据资产的区别 举例 CRM系统建设完成后会有很多数据,这些数据就是原始数据,业务…...
标度不变性(scale invariance)与无标度(scale-free)概念辨析
文章目录标度标度种类名义标度序级标度等距标度比率标度常用标度方法不足标度不变性标度不变(Scale-invariant)曲线和自相似性(self-similarity)射影几何分形随机过程中的标度不变性标度不变的 Tweedie distribution普适性&#x…...
WMS仓库管理系统解决方案,实现仓库管理一体化
仓库是企业的核心环节,若没有对库存的合理控制和送货,将会造成成本的上升,服务品质的难以得到保证,进而降低企业的竞争能力。WMS仓库管理系统包括基本信息,标签,入库,上架,领料&…...
css常见定位、居中方案_css定位居中
一、 定位分类 1、静态定位 position:static;(默认,具备标准流条件) 2、相对定位 position:relative; 通过 top 或者 bottom 来设置 Y 轴位置 通过 left 或者 right 来设置 X 轴位置 特点: 相对定位不会脱离文档流相对于自…...
【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
ArangoDB——AQL编辑器
AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言,更自然地适合无模式模型,并使查询语言非常强大,同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录,称为文…...
Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现
文章目录一、 集成学习的三大关键领域二、Bagging 方法的基本思想三、RandomForestRegressor 的实现在开始学习之前,先导入我们需要的库,并查看库的版本。 import numpy as np import pandas as pd import sklearn import matplotlib as mlp import sea…...
Informer实战指南:从ProbSparse自注意力到生成式解码器的长序列预测优化
1. Informer模型的核心突破:为什么比Transformer更适合长序列预测? 第一次看到Informer论文时,最让我惊讶的是它在AAAI 2021上击败了众多Transformer变体获得最佳论文。这个专为长序列预测(Long Sequence Time-series Forecasting…...
3步打造Windows字体终极体验:MacType高清渲染全攻略
3步打造Windows字体终极体验:MacType高清渲染全攻略 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 一、视觉痛点全解析:谁在忍受模糊字体的煎熬? 设计师的色彩…...
搭建专属汽车电子测试 AI 助手
专栏:《AI 汽车电子测试实战》第 15 篇 作者:一线汽车电子测试工程师 适合人群:想搭建私有 AI 助手的测试团队、关注数据安全的工程师开篇:为什么需要专属 AI 助手? 这是我上个月在某车企的 AI 部署项目中的真实经历。…...
解密数字图像处理中的m邻接:从理论到实战的连通性优化
1. 为什么我们需要m邻接? 第一次接触数字图像处理时,你可能和我一样被各种邻接关系绕晕。记得当时处理一个简单的二值图像,用8邻接做连通区域分析,结果两个明明分开的方块被错误地连在了一起。这就是典型的"歧义路径"问…...
Fillinger智能填充脚本终极指南:如何快速实现图形元素的智能分布
Fillinger智能填充脚本终极指南:如何快速实现图形元素的智能分布 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts Fillinger是一款专为Adobe Illustrator设计的智能填充脚…...
效率提升秘籍:用快马AI自动生成技能评估系统的管理后台与评分引擎
今天想和大家分享一个提升开发效率的实用技巧——如何快速搭建技能评估系统的核心模块。最近在做一个叫skill-vetter的项目,发现其中很多功能其实可以通过智能工具自动生成,省去了大量重复编码的时间。 题库管理模块的实现思路 这个模块的核心需求是让…...
Delphi XE在Linux上开发桌面应用:从安装FMXLinux插件到第一个跨平台GUI程序
Delphi XE在Linux上开发桌面应用:从安装FMXLinux插件到第一个跨平台GUI程序 引言 对于熟悉Delphi的开发者来说,将Windows平台上的成熟应用迁移到Linux环境一直是个挑战。Delphi XE虽然支持Linux开发,但官方仅提供命令行应用的支持ÿ…...
Windows 内网 Web 服务穿透方案推荐
Windows 内网 Web 服务穿透方案推荐 面向场景:内网机器为 Windows,需从公网或外网访问内网 HTTP/HTTPS Web 服务;优先选择相对不易被误报、来源清晰、可审计的方案。 关于「报毒」的说明 穿透类软件常被启发式引擎标为「风险/可疑」…...
【adb端口5555】烽火hg680系列安卓9线刷全攻略:告别强制升级与花屏困扰
1. 烽火HG680系列机顶盒的痛点与解决方案 最近在折腾烽火HG680-GY和HG680-GC这两款机顶盒的朋友应该都深有体会,官方系统用着用着就会弹出强制升级提示,有时候还会莫名其妙出现花屏问题。作为一个折腾过不下20台烽火盒子的老玩家,我太理解这种…...
FaceFusion项目二次开发踩坑记:深入content_analyser.py,手动修复模型依赖哈希问题
FaceFusion项目二次开发踩坑记:深入content_analyser.py,手动修复模型依赖哈希问题 当你在全新环境中部署经过二次开发的FaceFusion项目时,可能会遇到一个令人头疼的问题——模型文件哈希校验失败。这个问题通常表现为控制台输出类似[FACEFUS…...
