python实现二分查找及bisect模块的简介
2015-05-12 22:57
323 查看
在查找方面,python中有list.index()的方法。
二分查找的对象是:有序数组。这点特别需要注意。
算法基本步骤:
1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3.如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn)
下面有两种实现方法,一种是用递归,另一种是是用while循环控制。
python标准库中还有一个灰常给力的模块,那就是bisect。这个库接受有序的序列,内部实现就是二分。
<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实现二分查找与bisect模块详解
- Python中bisect模块用法,及实现方式
- python bisect模块
- Python 基金会 —— 模块和包简介
- Python:使用threading模块实现多线程(转)
- Python之Fabric模块 Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:
- Python RE 模块简介
- 利用python实现对鼠标的移动点击操作(PyMouse 模块安装方法)
- 完美配置Python3.5+Anaconda+PyQt5,实现UI和其他模块的结合
- 转:PAMIE- Python实现IE自动化的模块
- Python 使用urllib2模块实现断点续传下载
- 一个有趣的python排序模块:bisect
- python paramiko模块实现ssh远程控制
- Python CSV模块简介
- Python爬虫实现网页信息抓取功能示例【URL与正则模块】
- python使用smtplib模块通过gmail实现邮件发送的方法
- python bisect模块
- python分模块实现神经网络之CIFARF分类:1.加载CIFAR数据集中的数据
- 在python中实现动态导入模块importlib.import_module
- Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例