Python算法 折半搜索算法(二分法)
来源:互联网 发布:淘宝二手威图手机 编辑:程序博客网 时间:2024/06/14 02:34
在计算机科学中,折半搜索是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。这种搜索算法每一次比较都使搜索范围缩小一半。以上是来自wiki的解释。接下来看看Python的对这个算法的实现:
一、自己手动写:
def binary_search(data,find,lo=0,hi=None):
hi = hi if hi is not None else len(data)
while lo < hi:
mid = (lo+hi)//2
midval = data[mid]
if midval < find:
lo = mid +1
elif midval > find:
hi = mid
else:
return mid
return -1
if __name__ =="__main__":
#init a sorted list
data =[]
for i in range(0,100):
data.append(i)
#set a number we want to search
find = 65
index = binary_search(data,find)
print index
执行结果当然返回的是65。算法简要分析:
- O( n log n) 初始化创建列表
- O( log n) 用于查找
- O( n )插入或者删除(有可能是O(1)或者O(log n))
除了自己手动写以上的代码,你还可以使用python模块bisect.
from bisect import bisectfrom random import randrange
# Generate a sorted list of 100 thousand random numbers.
print 'Generating sorted random list...'
list = []
for i in range (0,100000):
list.append(randrange(10000000))
# This does all the work.
list.sort()
insert_point = bisect (list, number)
#insert_point返回的就是你要插入的位置
(注意一下例子返回的不是你要搜索的那个值在list的位置,而是要插入的位置),如果要返回搜索位置,可以如下:
from bisect import bisect_left
def binary_search_2(data,find,lo=0,hi=None):
hi = hi if hi is not None else len(data)
pos = bisect_left(data,find,lo,hi)
return (pos if pos != hi and data[pos] == find else -1)
if __name__ =="__main__":
#init a sorted list
data =[]
for i in range(0,100):
data.append(i)
#set a number we want to search
find = 165
index = binary_search_2(data,find)
print index
该例子返回为-1,就是没有搜索到的意思。
- Python算法 折半搜索算法(二分法)
- 搜索算法(折半查询)
- 二分法搜索算法
- 搜索算法之二分法
- 搜索算法之二分法
- 二分查找(折半搜索)算法
- 折半(对半)搜索算法
- 排序算法之二分法(折半)插入排序算法
- 【数据结构与算法】折半查找算法(二分法)
- 两分搜索算法(折半查找算法)
- 查找算法之折半搜索算法
- 二分查找算法、折半搜索、二分搜索
- 搜索算法-二分搜索(折半查找)
- 二分法查找(折半查找)算法学习笔记
- 二分法查找(折半查找)算法学习笔记
- Java程序实现二分法查找(折半查找)算法
- 二分搜索算法(折半查找)
- 分治法与折半搜索算法
- VS2010下配置Bullet开发环境
- Android SDK目录结构和工具介绍
- nginx 配置二
- Flex Effect
- 交叉编译tcpdump ,让其可以在mips环境下运行
- Python算法 折半搜索算法(二分法)
- 我的25年嵌入式生涯-周立功
- SQL Server 数据库最小宕机时间迁移方案
- nginx 配置一
- View Documentation in Web Using [openoffice.org 3+swftools+flexpaper]
- selenium常用知识点(二)
- zoj1959-Quadtree II
- 视频编码
- shell if