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

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

<span style="font-size:14px;">>>> a=[2,4,1,9,3]           #list可以是无序,也可以是有序
>>> a.index(4)              #找到后返回该值在list中的位置
1</span>
这是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]<value:
        return binarySearch1(lst,value,mid+1,high)
    else:
        return mid
def binarySearch2(lst,value):
    low,high = 0,len(lst)-1
    while low<=high:
        mid = (low+high)/2
        if lst[mid]<value:
            low = mid + 1
        elif value<lst[mid]:
            high = mid - 1
        else:
            return mid
    return -1

if __name__ == '__main__':
    l = range(50)
    print binarySearch1(l,10,0,49)
    print binarySearch2(l,10)

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,搜索)