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

在查找方面,python中有list.index()的方法。

>>> a=[2,4,1,9,3]           #list可以是无序,也可以是有序
>>> a.index(4)              #找到后返回该值在list中的位置
1
这是python中基本的查找方法,虽然简单,但是,如果由于其时间复杂度为O(n),对于大规模的查询恐怕是不足以胜任的。二分查找就是一种替代方法。

二分查找的对象是:有序数组。这点特别需要注意。

算法基本步骤:
1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3.如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn)

下面有两种实现方法,一种是用递归,另一种是是用while循环控制。

def binarySearch1(lst,value,low,high):
    if high < low:
        return -1
    mid = (low+high)/2
    if lst[mid]>value:
        return binarySearch1(lst,value,low,mid-1)
    elif lst[mid]

python标准库中还有一个灰常给力的模块,那就是bisect。这个库接受有序的序列,内部实现就是二分。

import bisect

def binarySearch3(lst,x):
    i = bisect.bisect_left(lst,x)
    if i != len(lst) and lst[i] == x:
        return i
    raise ValueError

if __name__ == '__main__':
    lst = sorted([2,5,2,7,3])
    print binarySearch3(lst,5)




你可能感兴趣的:(数据结构算法学习,算法,python,二分查找,搜索,递归)