背个书:
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
好了,相信你已经明白了,如果觉得不够直观的话敲几行试一试吧!!
版权归原作者 涛涛ALG 所有, 如有侵权,请联系我们删除。