当前位置: 首页 > news >正文

Python 二分查找:bisect库的使用

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


本文目录

  • 简介
  • bisect 库的使用
    • bisect_left
    • bisect_right
    • insort_left
    • insort_right
  • 二分查找基础实现


简介

bisect 库是 Python 标准库中的一部分,它提供了二分查找的功能。二分查找是一种在有序列表中查找某一特定元素的搜索算法。它的时间复杂度为 O(log⁡n)O(\log n)O(logn),比顺序查找的时间复杂度 O(n)O(n)O(n) 要有效率。

bisect 库的使用

bisect 库提供了 bisect_leftbisect_rightinsort_leftinsort_right四个函数,用于在有序列表中查找或插入元素。

bisect_left

bisect_left 函数用于在有序列表中二分查找某一位置,使得在该位置插入指定元素后仍保持有序,返回该位置,如果元素已经存在,则返回它的左边位置。

函数原型如下:

bisect.bisect_left(a, x, lo=0, hi=len(a), *, key=None)

其中,a 是一个有序列表,x 是要查找的元素,lohi 是查找范围的左右边界,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 是要查找的元素,lohi 是查找范围的左右边界,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 是要插入的元素,lohi 是查找范围的左右边界,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 是要插入的元素,lohi 是查找范围的左右边界,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
  • 存在 i0 < 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库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

性能优化之HBase性能调优

HBase是Hadoop生态系统中的一个组件&#xff0c;是一个分布式、面向列存储的内存型开源数据库&#xff0c;可以支持数百万列&#xff08;MySQL4张表在HBase中对应1个表&#xff0c;4个列&#xff09;、超过10亿行的数据存储。可用作&#xff1a;冷热数据分离HBase适合作为冷数据…...

图像金字塔,原理、实现及应用

什么是图像金字塔 图像金字塔是对图像的一种多尺度表达&#xff0c;将各个尺度的图像按照分辨率从小到大&#xff0c;依次从上到下排列&#xff0c;就会形成类似金字塔的结构&#xff0c;因此称为图像金字塔。 常见的图像金字塔有两类&#xff0c;一种是高斯金字塔&#xff0…...

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、使用正则匹配转自&#xff1a;https://cloud.tencent.com/developer/article/1699719我们经常会遇这样一个需求&#xff1a;判断字符串中是否包含某个关键词…...

aop实现接口访问频率限制

引言 项目开发中我们有时会用到一些第三方付费的接口&#xff0c;这些接口的每次调用都会产生一些费用&#xff0c;有时会有别有用心之人恶意调用我们的接口&#xff0c;造成经济损失&#xff1b;或者有时需要对一些执行时间比较长的的接口进行频率限制&#xff0c;这里我就简…...

Hive---窗口函数

Hive窗口函数 其他函数: Hive—Hive函数 文章目录Hive窗口函数开窗数据准备建表导入数据聚合函数window子句LAG(col,n,default_val) 往前第 n 行数据LEAD(col,n, default_val) 往后第 n 行数据ROW_NUMBER() 会根据顺序计算RANK() 排序相同时会重复&#xff0c;总数不会变DENSE…...

JavaSe第7次笔记

1. C语言里面&#xff0c;NULL是0地址。Java中null和0地址没关系。 2.数组可以做方法的返回值。 3.可以使用变量作为数组的个数开辟空间。 4.断言assert&#xff0c;需要设置。 5.排序&#xff1a;Arrays. sort(array); 6.查找&#xff1a; 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的工程&#xff0c;然后发现调试工程配置这里的型号和创建工程选的型号不一致&#xff0c;手动更改一下&#xff0c;使用PW Link下载程序的话还要配置一下pyocd.exe的路径。 打开drv_clk.c文件的调试功能看下系统时钟频率。 项目使用的是AT32F437VMT7芯片&…...

Springboot项目启动初始化数据缓存

1.从Java EE5规范开始&#xff0c;Servlet中增加了两个影响Servlet生命周期的注解&#xff0c; PostConstruct和PreDestroy&#xff0c;这两个注解被用来修饰一个非静态的void&#xff08;&#xff09;方法&#xff0c;被PostConstruct修饰的方法会在服务器加载Servlet的时候运…...

深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化

在深度学习中&#xff0c;第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴&#xff0c;数据集经常要用Voc格式的&#xff0c;比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化&…...

数据、数据资源及数据资产管理的区别

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a;数据、数据资源、数据资产 数据、数据资源及数据资产的区别 举例 CRM系统建设完成后会有很多数据&#xff0c;这些数据就是原始数据&#xff0c;业务…...

标度不变性(scale invariance)与无标度(scale-free)概念辨析

文章目录标度标度种类名义标度序级标度等距标度比率标度常用标度方法不足标度不变性标度不变&#xff08;Scale-invariant&#xff09;曲线和自相似性&#xff08;self-similarity&#xff09;射影几何分形随机过程中的标度不变性标度不变的 Tweedie distribution普适性&#x…...

WMS仓库管理系统解决方案,实现仓库管理一体化

仓库是企业的核心环节&#xff0c;若没有对库存的合理控制和送货&#xff0c;将会造成成本的上升&#xff0c;服务品质的难以得到保证&#xff0c;进而降低企业的竞争能力。WMS仓库管理系统包括基本信息&#xff0c;标签&#xff0c;入库&#xff0c;上架&#xff0c;领料&…...

css常见定位、居中方案_css定位居中

一、 定位分类 1、静态定位 position:static;&#xff08;默认&#xff0c;具备标准流条件&#xff09; 2、相对定位 position:relative; 通过 top 或者 bottom 来设置 Y 轴位置 通过 left 或者 right 来设置 X 轴位置 特点&#xff1a; 相对定位不会脱离文档流相对于自…...

【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

ArangoDB——AQL编辑器

AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言&#xff0c;更自然地适合无模式模型&#xff0c;并使查询语言非常强大&#xff0c;同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录&#xff0c;称为文…...

Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现

文章目录一、 集成学习的三大关键领域二、Bagging 方法的基本思想三、RandomForestRegressor 的实现在开始学习之前&#xff0c;先导入我们需要的库&#xff0c;并查看库的版本。 import numpy as np import pandas as pd import sklearn import matplotlib as mlp import sea…...

从习题到实战:掌握随机变量及其分布的5个核心场景

1. 从杯子分球看离散型随机变量 想象你面前有4个空杯子和3个乒乓球&#xff0c;随手把球扔进杯子里会发生什么&#xff1f;这个看似简单的游戏&#xff0c;其实是理解离散型随机变量的绝佳案例。X代表"杯子中球的最大个数"&#xff0c;它可能取值为1、2、3——这就是…...

STM32高效驱动WS2812:SPI+DMA时序精解与实战避坑

1. WS2812驱动原理与SPIDMA方案优势 第一次接触WS2812灯带时&#xff0c;我被它的单线控制方式惊艳到了——只需要一根信号线就能控制数百个RGB灯珠。但真正动手实现时才发现&#xff0c;这个看似简单的协议背后藏着不少玄机。WS2812采用归零码&#xff08;RZ&#xff09;编码方…...

文献处理效率暴跌?NotebookLM Agent的3层语义理解架构,让PDF秒变可推理知识图谱!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;文献处理效率暴跌&#xff1f;NotebookLM Agent的3层语义理解架构&#xff0c;让PDF秒变可推理知识图谱&#xff01; 传统PDF阅读工具仅支持关键词检索与线性浏览&#xff0c;面对百页学术论文或跨领域…...

Python轻量级Web框架fws:从核心原理到RESTful API实战

1. 项目概述&#xff1a;一个轻量级、可扩展的Web服务框架在构建现代Web应用时&#xff0c;我们常常面临一个选择&#xff1a;是使用功能全面但可能略显臃肿的成熟框架&#xff0c;还是从零开始&#xff0c;只为满足特定需求而构建一个精简的解决方案&#xff1f;前者提供了开箱…...

MooseFS企业级部署方案:多数据中心架构设计与实施指南

MooseFS企业级部署方案&#xff1a;多数据中心架构设计与实施指南 【免费下载链接】moosefs MooseFS Distributed Storage – Open Source, Petabyte, Fault-Tolerant, Highly Performing, Scalable Network Distributed File System / Software-Defined Storage 项目地址: h…...

深入解析dlsym的RTLD_NEXT:从符号查找到全局介入的实战指南

1. 揭开RTLD_NEXT的神秘面纱&#xff1a;符号查找的"接力赛" 第一次在代码里看到dlsym(RTLD_NEXT, "printf")这种写法时&#xff0c;我盯着屏幕发了五分钟呆——这行代码就像Linux系统中的魔法咒语&#xff0c;明明每个字母都认识&#xff0c;组合起来却让…...

CLion集成LVGL与SDL:打造高效嵌入式GUI模拟开发环境

1. 为什么需要CLionLVGLSDL组合&#xff1f; 如果你正在开发嵌入式设备的图形界面&#xff0c;肯定遇到过这样的困境&#xff1a;每次修改UI都要烧录到硬件上测试&#xff0c;一个简单的颜色调整可能要反复折腾十几分钟。我在开发智能手表项目时就深受其害&#xff0c;直到发现…...

深度解析Layui formSelects:现代Web应用中的多选下拉框终极解决方案

深度解析Layui formSelects&#xff1a;现代Web应用中的多选下拉框终极解决方案 【免费下载链接】layui-formSelects Layui select多选小插件 项目地址: https://gitcode.com/gh_mirrors/la/layui-formSelects 在当今的Web开发领域&#xff0c;表单交互体验直接影响着用…...

Unity实战:用RenderTexture和LineRenderer搞定3D物体擦除效果(附完整Shader代码)

Unity实战&#xff1a;用RenderTexture和LineRenderer实现高精度3D物体擦除效果 在游戏开发中&#xff0c;3D物体的动态擦除效果常被用于刮刮乐、迷雾探索、橡皮擦等交互场景。传统实现方式往往面临性能瓶颈或视觉效果不佳的问题。本文将深入探讨如何结合RenderTexture和LineRe…...

ARMv8-A A64指令集:符号扩展与位操作指令详解

1. A64指令集符号扩展与位操作指令概述在ARMv8-A架构的A64指令集中&#xff0c;符号扩展和位操作指令构成了处理器基础运算能力的重要部分。这些指令通过硬件级优化实现了高效的数据类型转换和位级操作&#xff0c;为底层系统编程和性能敏感型应用提供了关键支持。符号扩展指令…...