0


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

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

标签: python 算法

本文转载自: https://blog.csdn.net/sunjintaoxxx/article/details/120763237
版权归原作者 涛涛ALG 所有, 如有侵权,请联系我们删除。

“Python bisect模块详解”的评论:

还没有评论