查找算法
前言
学习各种查找算法,后续会继续补充。
一、二分查找
1.工作原理
小红和小明玩猜数字游戏,小红在1~100中想一个数字,由小明去猜。小明的最佳做法是猜中间的数,当小红说大或小后,总能排除余下数字的一半,最终猜到正确数字,这就是二分查找。
2.与顺序查找比较
如要在含有16个单词的单词表中查找一个单词:
采用顺序查找最多会执行16步;1->2->3…->16
采用二分查找最多会执行4步;8->4->2->1
如果单词表含有240000个单词
采用顺序查找最多会执行240000步;
采用二分查找最多会执行17步;
对于顺序查找最多需要n步
而对于二分查找最多需要
log
2
n
\log_2^n
log2n步
扩:对数运算是幂运算的逆运算
例:
2
4
2^4
24=16 <=>
log
2
16
\log_216
log216=4
3.二分查找代码
def binary_search(list,item):
low = 0;
high = len(list)-1;
while low <= high:
mid = (low + high)/2
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid-1
else:
low = mid+1
return None
找到返回其下标,否则返回空
4.读入数据
代码如下(示例):
my_list = [1,3,5,7,9]
print binary_search(my_list,3)
1
print binary_search(my_list,-1)
None
5.总结
二分查找算法的时间复杂度:O(
l
o
g
n
logn
logn) (对数时间)
简单查找的时间复杂度:O(n) (线性时间)
二分查找的速度比简单查找快得多,O(
l
o
g
n
logn
logn)比O(n)快,需要搜索的元素越多,前者越快
扩:在谈论算法的速度时,指的是随着输入的增加,其运行时间将以什么样的速度增加,并不是指时间,而是操作数的增速