Python bisect模块详解

背个书:
bisect模块支持按排序顺序维护列表,而不必在每次插入后对列表进行排序。对于具有昂贵比较操作的长项目列表,这可能是对更常见方法的改进。之所以调用该模块,是bisect因为它使用基本的二分算法来完成其工作

详细请看:bisect文档

内置方法
bisect.bisect_left( a , x , lo = 0 , hi = len(a) , * , key = None )
bisect.bisect_right( a , x , lo = 0 , hi = len(a) , * , key = None ) 
bisect.bisect( a , x , lo = 0 , hi = len(a) )
bisect.insort_left( a , x , lo = 0 , hi = len(a) , * , key = None )
bisect.insort_right( a , x , lo = 0 , hi = len(a) , * , key = None ) 
bisect.insort( a , x , lo = 0 , hi = len(a))

bisect系列方法用于寻找插入点,insort系列方法用于在已知插入点插入

问题一:加了left、right的bisect/insort有什么用?

其实,只有在待插入x 已存在于数组a中时才有差异存在,我们暂且将已存项定为y
此时,当使用left时,插入点被定位到y左侧,反之在y右侧

**当bisect/insort不被left/right修饰呢?:此时的操作与加了right一样

问题二:insort()方法怎样知道插入点呢?想必你已经猜到了。来看官方解释:在这里插入图片描述

这是官方对.insort_left()的解释,其中一句:首先执行bisect_left()去定位插入点

This function first runs bisect_left() to locate an insertion point.

那么:

insort_left首先执行bisect_left来定位,相应的inosrt_right首先执行bisect_right来定位(insort的操作与insort.right一样)
问题三:关于参数lo、hi的理解

在通常情况下,我们只用到参数a(原数组),x(待插数)
但对于其他的也得理解不是

在python文档中,bisect方法中有这么一段话
在这里插入图片描述
******* a是原数组,x 是我们待插入的数,i是函数找到的插入点

那么我们知道:
1.定位点将原数组分为两半
2.这两个数组分别是a[ lo:i ],a[ i:hi ]
3.对于待插入x 需要满足:1)a[ lo:i ]中所有元素不大于x 2)a[ i:hi ]中所有元素不小于x

好了,相信你已经明白了,如果觉得不够直观的话敲几行试一试吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛ALG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值