• Python笔记:bisect库简介

    • 1. bisect库是什么
    • 2. 二分查找操作
      • 1. bisect内置函数说明
      • 2. 单纯的二分查找实现方法
    • 3. 插入 & 删除操作
      • 1. 数据的插入
      • 2. 数据的删除
    • 4. 参考链接

1. bisect库是什么

今天在做题的时候偶然发现python中有一个强大的内置库,即bisect库,它能够轻易地实现顺序列表中的二分查找与插入操作

因此,这里,我们就来简单地看一下bisect库使用方法。

它非常地简单,仅包含以下6个函数:

  1. bisect_left(nums, tgt, lo=0, hi=len(nums))
  2. bisect_right(nums, tgt, lo=0, hi=len(nums))
  3. bisect(nums, tgt, lo=0, hi=len(nums))
  4. insort_left(nums, tgt, lo=0, hi=len(nums))
  5. insort_right(nums, tgt, lo=0, hi=len(nums))
  6. 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库简介相关推荐

  1. Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略

    Py之Pandas:Python的pandas库简介.安装.使用方法详细攻略 目录 pandas库简介 pandas库安装 pandas库使用方法 1.函数使用方法 2.使用经验总结 3.绘图相关操作 ...

  2. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  3. Python常用第三方库——简介及下载地址

    Python常用第三方库 可以在  The Python Package Index (PyPI)  软件库(官网主页:https://pypi.org/  )查询.下载 和 发布 Python包或库 ...

  4. python的lxml库简介_Python lxml库简介

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取.市面上有很多现 ...

  5. python第三方工具箱_我的Python笔记——标准库、第三方工具包

    1.标准库 标准库即安装Python时自带的库,但不能直接调用,需要用Import语句引入. 1)sys argv:命令行参数 exit([arg]):退出当前程序,可提供返回值或错误信息 modul ...

  6. python的lxml库简介_lxml库

    lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据. lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可 ...

  7. python笔记-标准库unittest

    unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 一个TestCase的实例就是一 ...

  8. Python笔记:itertools库简介

    Python笔记:itertools库简介 1. itertools库是什么 2. itertools库函数简介 1. 元素迭代相关 1. count 2. cycle 3. repeat 2. 排列 ...

  9. Python:numpy库中的一些函数简介、使用方法之详细攻略

    Python:numpy库中的一些函数简介.使用方法之详细攻略 目录 numpy库中的一些函数简介.使用方法 1.np.concatenate() 1.1.函数案例 1.2.函数用法 numpy库中的 ...

最新文章

  1. c语言实现天气预报步骤,一份天气预报的制作历程
  2. phpstudy安装imagick扩展库怎么装
  3. nvidia驱动程序与windows版本不兼容
  4. sysfs cannot create duplicate filename问题
  5. COM 组件设计与应用(十一)
  6. Linux允许61440端口,释放对某端口的占用
  7. 第一个程序03 - 零基础入门学习汇编语言22
  8. @PathVariable获取带点参数,获取不全
  9. Java学习手册:Java面向对象面试问题
  10. 智能随机分组系统(代码带备注)
  11. 更改网络计算机ip,教你快速修改电脑IP地址
  12. andriod自带模拟器使用代理
  13. 身份证读取设备开发解决方案:1、Windows下开发Qt程序demo读取身份证信息
  14. 时光机穿梭-管理修改
  15. 论文录用后不想发了,撤稿会有什么影响吗?
  16. 推荐一款非常好用的效率APP
  17. ASP.NET MVC-4种过滤器
  18. 解决报错【internal/modules/cjs/loader.js:905 throw err;】
  19. AUXR AUXR1
  20. 决策树详解 从零到入门

热门文章

  1. HP笔记本驱动安装顺序
  2. Javascript中的Promise用法
  3. 怎么叫一手一机的功能方式
  4. jquery-1.10.2.min.map 404 (Not Found)问题及解决
  5. 我的世界lifeboat服务器怎么注册,精选服务器/Lifeboat Network
  6. QTranslate国际化及多语言切换
  7. Revit二次开发知识分享(五)单位转换问题
  8. 地下城装无盘服务器,DNF探秘地下城无尽模式:学会这3招,让你冲击服务器前10名!...
  9. oledbdatareader和OleDbDataAdapter之间的区别
  10. 索尼android l主题,UI:主题全部更新细节有所更改_索尼 Xperia Z1_手机Android频道-中关村在线...