赞
踩
http://blog.csdn.net/pipisorry/article/details/72307432
Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n)。对于大数据量,则可以用二分查找进行优化。二分查找要求对象必须有序,其基本原理如下:
二分查找也成为折半查找,算法每一次比较都使搜索范围缩小一半, 其时间复杂度为 O(logn)。
Python 有一个bisect
模块,用于维护有序列表。
bisect
模块实现了一个算法用于插入元素到有序列表。在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect 是二分法的意思,这里使用二分法来排序,它会将一个元素插入到一个有序列表的合适位置,这使得不需要每次调用 sort 的方式维护有序列表。
先说明的是,使用这个模块的函数前先确保操作的列表是已排序的。
查找在有序列表 a 中插入 x 的index。lo 和 hi 用于指定列表的区间,默认是使用整个列表。如果 x 已经存在,在其左边插入。返回值为 index。
这2个函数和 bisect_left 类似,但如果 x 已经存在,在其右边插入。
在有序列表 a 中插入 x。和 a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。
和 insort_left 类似,但如果 x 已经存在,在其右边插入。
Bisect 模块提供的函数可以分两类: bisect*
只用于查找 index, 不进行实际的插入;而 insort*
则用于实际插入。该模块比较典型的应用是计算分数等级;同样,我们可以用 bisect 模块实现二分查找。
side='right'。numpy.searchsorted 效率是很低的,跟 bi
sect 根本不在一个数量级上。因此 searchsorted 不适合用于搜索普通的数组,但是它用来搜索
numpy.ndarray 是相当快的。
先说明的是,使用这个模块的函数前先确保操作的列表是已排序的。
先看看 insort 函数:
其插入的结果是不会影响原有的排序。
再看看 bisect 函数:
其目的在于查找该数值将会插入的位置并返回,而不会插入。
接着看 bisect_left 和 bisect_right 函数,该函数用入处理将会插入重复数值的情况,返回将会插入的位置:
其对应的插入函数是 insort_left 和 insort_right :
可见,单纯看其结果的话,两个函数的操作结果是一样的,其实插入的位置不同而已。
更多示例参考[ bisect — Array bisection algorithm]from: http://blog.csdn.net/pipisorry/article/details/72307432
ref: [bisect — Array bisection algorithm]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。