关闭

Python模块:bisect二分算法模块

标签: Pythonbisect模块二分算法
617人阅读 评论(0) 收藏 举报
分类:

http://blog.csdn.net/pipisorry/article/details/72307432

Bisect模块简介

Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n)。对于大数据量,则可以用二分查找进行优化。二分查找要求对象必须有序,其基本原理如下:

  • 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
  • 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
  • 3.如果在某一步骤数组为空,则代表找不到。

二分查找也成为折半查找,算法每一次比较都使搜索范围缩小一半, 其时间复杂度为 O(logn)。

Python 有一个 bisect 模块,用于维护有序列表。bisect 模块实现了一个算法用于插入元素到有序列表。在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect 是二分法的意思,这里使用二分法来排序,它会将一个元素插入到一个有序列表的合适位置,这使得不需要每次调用 sort 的方式维护有序列表。

先说明的是,使用这个模块的函数前先确保操作的列表是已排序的。

Bisect模块提供的函数

  • bisect.bisect_left(a,x, lo=0, hi=len(a)) :

查找在有序列表 a 中插入 x 的index。lo 和 hi 用于指定列表的区间,默认是使用整个列表。如果 x 已经存在,在其左边插入。返回值为 index。

  • bisect.bisect_right(a,x, lo=0, hi=len(a))
  • bisect.bisect(a, x,lo=0, hi=len(a)) :

这2个函数和 bisect_left 类似,但如果 x 已经存在,在其右边插入。

  • bisect.insort_left(a,x, lo=0, hi=len(a)) :

在有序列表 a 中插入 x。和 a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。

  • bisect.insort_right(a,x, lo=0, hi=len(a))
  • bisect.insort(a, x,lo=0, hi=len(a)) :

和 insort_left 类似,但如果 x 已经存在,在其右边插入。

Bisect 模块提供的函数可以分两类: bisect* 只用于查找 index, 不进行实际的插入;而 insort* 则用于实际插入。该模块比较典型的应用是计算分数等级;同样,我们可以用 bisect 模块实现二分查找

Python 著名的数据处理库 numpy 也有一个用于二分查找的函数 numpy.searchsorted, 用法与 bisect 基本相同,只不过如果要右边插入时,需要设置参数 side='right'。numpy.searchsorted 效率是很低的,跟 bisect 根本不在一个数量级上。因此 searchsorted 不适合用于搜索普通的数组,但是它用来搜索 numpy.ndarray 是相当快的。

皮皮blog



Bisect示例

先说明的是,使用这个模块的函数前先确保操作的列表是已排序的。

      

       先看看 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]

[Python 二分查找与 bisect 模块]


0
0
查看评论

Python二分查找算法

二分查找又称折半查找, 优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
  • u014745194
  • u014745194
  • 2017-05-29 16:42
  • 383

二分查找算法python实现

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
  • u010339879
  • u010339879
  • 2017-10-24 16:17
  • 97

二分查找算法 python

def binary_search(l,num): low,high = 0,len(l) while low <= high: print low, high mid = (low+high)/2 if num < l[m...
  • A13155283231
  • A13155283231
  • 2017-02-17 10:23
  • 133

python中bisect模块的使用

一般用于二分查找, 当然列表应该是有序表 参考于: http://blog.csdn.net/xiaocaiju/article/details/6975714
  • u011002599
  • u011002599
  • 2014-02-16 14:19
  • 634

python实现二分查找及bisect模块的简介

在查找方面,python中有list.index()的方法。 >>> a=[2,4,1,9,3] #list可以是无序,也可以是有序 >>> a.index(4) #找到后返回该值在list中的位置 1这是pyt...
  • djd1234567
  • djd1234567
  • 2015-05-12 22:57
  • 3030

【Python】二分查找算法

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的...
  • bonnybonny
  • bonnybonny
  • 2015-10-03 18:14
  • 376

二分查找 python实现

二分查找的python查找,经典的面试题,啥也不多,直接上代码 def binSearch(list,num): low = 0 high = len(list) - 1 middle = (high + low) / 2 while(low <= high...
  • bitcarmanlee
  • bitcarmanlee
  • 2016-03-28 22:02
  • 968

python数组查找算法---bisect二分查找插入

这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  [python] view plaincopyprint? import bisect      L&#...
  • crazyhacking
  • crazyhacking
  • 2014-06-11 16:24
  • 5335

Python中bisect模块用法,及实现方式

#bisect用法: import bisect bisect.bisect_left(t,x) #在T列表中查找x,若存在,返回x左侧位置 bisect.bisect_right(t,x) bisect.insort_left(t,x) #在T列表中查找X,若存在,插入x左侧; bisect.in...
  • fcts1230
  • fcts1230
  • 2015-09-28 22:24
  • 371

Python 数据结构与算法——二分图(bipartite graph)

如上为一个二分图的具体实例,意味着在该图中,节点(Vertices)被分为两个集合,而所有的边(Edge)都只存在于两个集合之间(不存在两个集合内部)。如何用相关数据结构对这个二分图进行表示呢。我们可能会从图结构方面、或反映图像之间映射关系的某个函数开始思考。但本质上说,这里映射关系只不过是各元素(...
  • lanchunhui
  • lanchunhui
  • 2016-03-22 09:31
  • 1453
    个人资料
    • 访问:3642797次
    • 积分:30698
    • 等级:
    • 排名:第194名
    • 原创:569篇
    • 转载:30篇
    • 译文:5篇
    • 评论:316条
    Welcome to 皮皮blog~

    博客专栏
    最新评论