python - 二分查找
概述:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好。
其缺点是要求待查表为有序表,折半查找方法适用于不经常变动而查找频繁的有序列表。
二分查找在我们生活中也经常出现,比如猜数游戏,最快的方法就是:先说中间的数字,直接把答案范围缩短一半。
特点:
每次都是比较数组的中间值,如果没有找到就是在另外一个范围里,不断如上操作,缩短范围,直到取到值。
算法复杂度
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较;
-
如果x=a[n/2],则找到x,算法中止;
-
如果x<a[n/2],则只要在数组a的左半部分继续搜索x;
-
如果x>a[n/2],则只要在数组a的右半部搜索x;
-
时间复杂度无非就是while循环的次数!
# seq 待查序列
# item 要查找的目标
def binary_search(seq, item):
# 列表的头和尾,代表着数组范围的最小和最大
# start 为起始索引, end 为结束索引
start = 0 # 下标从 0 开始
end = len(seq) - 1 # 下标从 0 开始,所以要减一
while start <= end:
mid = start + (end - start) // 2 # // 整除
val = seq[mid] # 取序列的中间值
if val == item:
# 如果中间值等于索引值,那么就返回中间值的下标
return mid
elif val < item:
# 目标值大于中间值
# 说明目标值在mid - end之间
start = mid + 1
else:
# 目标值小于于中间值
# 说明目标值在start - mid之间
end = mid - 1
# 目标值不存在于seq中,返回None
return None
if __name__ == "__main__":
seq = [1, 3, 5, 7, 8, 10, 13]
print("找到:", 3, " 索引是: ", binary_search(seq, 3))
# 找到: 3 索引是: 1
递归方法实现
对递归还不是很熟悉,请看这篇:
https://www.cnblogs.com/wwho/p/15166348.html
def binary_search(item, start, end):
"""
:param item: 猜测的数字
:param start: 开始下标
:param end: 结束的下标
:return:
"""
if start <= end:
mid = (start + end) // 2
val = list[mid]
if item < val:
end = mid - 1
elif item > val:
start = mid + 1
else: # 如果相等,直接返回下标
return mid
return binary_search(item, start, end) # 递归
else:
return None # 没有找到
if __name__ == '__main__':
list = [1, 3, 5, 7, 8, 10, 13]
print("找到:", 3, " 索引是: ", binary_search(3, 0, len(list) - 1)) # 找到: 3 索引是: 1
以上实现方法适用于有序的列表,如果是无序的,先排序(sort方法或者冒泡方法排序),在二分查找。
---分界线---
着急也没有用,你又得不到你配不上的东西。