Python笔记:bisect库简介
- Python笔记:bisect库简介
- 1. bisect库是什么
- 2. 二分查找操作
- 1. bisect内置函数说明
- 2. 单纯的二分查找实现方法
- 3. 插入 & 删除操作
- 1. 数据的插入
- 2. 数据的删除
- 4. 参考链接
1. bisect库是什么
今天在做题的时候偶然发现python中有一个强大的内置库,即bisect库,它能够轻易地实现顺序列表中的二分查找与插入操作。
因此,这里,我们就来简单地看一下bisect库使用方法。
它非常地简单,仅包含以下6个函数:
bisect_left(nums, tgt, lo=0, hi=len(nums))
bisect_right(nums, tgt, lo=0, hi=len(nums))
bisect(nums, tgt, lo=0, hi=len(nums))
insort_left(nums, tgt, lo=0, hi=len(nums))
insort_right(nums, tgt, lo=0, hi=len(nums))
insort(nums, tgt, lo=0, hi=len(nums))
其中,2和3以及5和6本质上来说又是完全相同的(后面我们不会再对其进行区分),因此,事实上bisect库中仅仅包含有4个函数,其中bisect_left()
与bisect()
用于二分查找,而insort_left()
和insort()
用于数据的插入。
2. 二分查找操作
二分查找是bisect给出的最核心功能,顾名思义,就是提供了二分查找方法,使得可以在O(log(N))O(log(N))O(log(N))时间复杂度的情况下准确地找到元素的目标位置。
1. bisect内置函数说明
我们使用bisect()
函数或者bisect_left()
函数即可快速地实现顺序列表中任意一个元素的查找。
但是,需要强调的是,bisect提供的查找操作并非是直接找到目标元素的位置,而是找到如果要插入元素,则应当插入的位置。
例如:
from bisect import *nums = [1,2,3]
bisect_left(nums, 0) # 0
bisect_left(nums, 1) # 0
bisect_right(nums, 1) # 1nums = [1,1,1,1]
bisect_left(nums, 1) # 0
bisect_right(nums, 1) # 4
用python语言来翻译一下这两个函数的话,应该为:
def bisect_left(nums, tgt, lo=0, hi=len(nums)):if lo >= hi or nums[lo] >= tgt:return loif nums[hi-1] < tgt:return hiwhile hi-lo > 1:mid = (hi+lo) // 2if nums[mid] >= tgt:hi = midelse:lo = midreturn lodef bisect_right(nums, tgt, lo=0, hi=len(nums)):if lo >= hi or nums[lo] > tgt:return loif nums[hi-1] <= tgt:return hiwhile hi-lo > 1:mid = (hi+lo) // 2if nums[mid] > tgt:hi = midelse:lo = midreturn hi
2. 单纯的二分查找实现方法
由上,如果单纯就是要使用bisect来实现一个二分查找,如果找到则返回idx,否则返回-1的话,正确的实现应该为:
from bisect import *def bi_search(nums, tgt):idx = bisect_left(nums, tgt)if idx == len(nums) or nums[idx] != tgt:return -1return idxnums = [1,2,3]
bi_search(nums, 1) # 0
bi_search(nums, 5) # -1
3. 插入 & 删除操作
基于上述二分查找的结果,我们可以快速地完成有序数列的插入以及删除操作。
不过,如前所述,插入操作事实上bisect库本身已经提供了对应的插入函数。
删除操作虽然没有提供相应的操作,但是我们同样可以快速地进行自定义实现。
1. 数据的插入
bisect库中自带了insort_left()
以及insort_right()
两个插入函数,他们的实现也非常的trival,分别定义如下:
def insort_left(nums, tgt, lo=0, hi=len(nums)):idx = bisect_left(nums, tgt, lo, hi)nums.insert(idx, tgt)returndef insort_right(nums, tgt, lo=0, hi=len(nums)):idx = bisect_right(nums, tgt, lo, hi)nums.insert(idx, tgt)return
因此,我们只需要使用上述两个内置函数,就能轻易地实现顺序列表中数据的顺序插入。
但是,需要注意的是,虽然insort方法在index的检索上的时间复杂度仅为O(log(N))O(log(N))O(log(N)),但是插入操作insert的时间复杂度却是O(N)O(N)O(N)的,因此,整体的插入操作的时间复杂度依然还是O(N)O(N)O(N)量级的。
2. 数据的删除
同样地,仿照上述我们自定义实现的数据查找方法,我们同样可以快速给出基于bisect库的数据删除操作。
from bisect import *def bi_delete(nums, tgt):idx = bisect_left(nums, tgt)if idx < len(nums) and nums[idx] == tgt:nums.pop(idx)return nums = [1,1,1]
bi_delete(nums, 1) # nums = [1,1]
同样,受限于pop操作的时间复杂度,这一操作的整体时间复杂度还是在O(N)O(N)O(N)量级。
4. 参考链接
- https://docs.python.org/3/library/bisect.html
Python笔记:bisect库简介相关推荐
- Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略
Py之Pandas:Python的pandas库简介.安装.使用方法详细攻略 目录 pandas库简介 pandas库安装 pandas库使用方法 1.函数使用方法 2.使用经验总结 3.绘图相关操作 ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- Python常用第三方库——简介及下载地址
Python常用第三方库 可以在 The Python Package Index (PyPI) 软件库(官网主页:https://pypi.org/ )查询.下载 和 发布 Python包或库 ...
- python的lxml库简介_Python lxml库简介
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取.市面上有很多现 ...
- python第三方工具箱_我的Python笔记——标准库、第三方工具包
1.标准库 标准库即安装Python时自带的库,但不能直接调用,需要用Import语句引入. 1)sys argv:命令行参数 exit([arg]):退出当前程序,可提供返回值或错误信息 modul ...
- python的lxml库简介_lxml库
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据. lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可 ...
- python笔记-标准库unittest
unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 一个TestCase的实例就是一 ...
- Python笔记:itertools库简介
Python笔记:itertools库简介 1. itertools库是什么 2. itertools库函数简介 1. 元素迭代相关 1. count 2. cycle 3. repeat 2. 排列 ...
- Python:numpy库中的一些函数简介、使用方法之详细攻略
Python:numpy库中的一些函数简介.使用方法之详细攻略 目录 numpy库中的一些函数简介.使用方法 1.np.concatenate() 1.1.函数案例 1.2.函数用法 numpy库中的 ...
最新文章
- c语言实现天气预报步骤,一份天气预报的制作历程
- phpstudy安装imagick扩展库怎么装
- nvidia驱动程序与windows版本不兼容
- sysfs cannot create duplicate filename问题
- COM 组件设计与应用(十一)
- Linux允许61440端口,释放对某端口的占用
- 第一个程序03 - 零基础入门学习汇编语言22
- @PathVariable获取带点参数,获取不全
- Java学习手册:Java面向对象面试问题
- 智能随机分组系统(代码带备注)
- 更改网络计算机ip,教你快速修改电脑IP地址
- andriod自带模拟器使用代理
- 身份证读取设备开发解决方案:1、Windows下开发Qt程序demo读取身份证信息
- 时光机穿梭-管理修改
- 论文录用后不想发了,撤稿会有什么影响吗?
- 推荐一款非常好用的效率APP
- ASP.NET MVC-4种过滤器
- 解决报错【internal/modules/cjs/loader.js:905 throw err;】
- AUXR AUXR1
- 决策树详解 从零到入门
热门文章
- HP笔记本驱动安装顺序
- Javascript中的Promise用法
- 怎么叫一手一机的功能方式
- jquery-1.10.2.min.map 404 (Not Found)问题及解决
- 我的世界lifeboat服务器怎么注册,精选服务器/Lifeboat Network
- QTranslate国际化及多语言切换
- Revit二次开发知识分享(五)单位转换问题
- 地下城装无盘服务器,DNF探秘地下城无尽模式:学会这3招,让你冲击服务器前10名!...
- oledbdatareader和OleDbDataAdapter之间的区别
- 索尼android l主题,UI:主题全部更新细节有所更改_索尼 Xperia Z1_手机Android频道-中关村在线...