二分法的实现
引入:从一个按照从小到大排列的数字列表中找到指定的数字,传统方式:使用遍历来处理,但效率太低。这里我们引入另外一种方法--二分法,可以极大低缩小问题规模。
看一个实际的例子:从给定列表中找到17的位置
L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
二分法图解:
示例代码1:
L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
def find(num, L):
if len(L) == 0:
print('not exists')
return
mid_index = len(L) // 2 # 取中间值,长度取整(取出来的是索引)
print(mid_index)
if num > L[mid_index]: # 判断列表中间值和寻找值的大小关系
L = L[mid_index+1:] # 对列表重新赋值,缩小列表范围
find(num, L) # 递归
elif num < L[mid_index]:
L = L[:mid_index]
find(num, L)
else:
print('Find it')
find(17,L)
示例代码2--获取索引
def find(num, L, start=0, stop=len(L)-1):
if start <= stop:
mid_index = start+(stop-start)//2
print('start:%s stop:%s mid_index:%s mid_val:%s' %(start, stop, mid_index, L[mid_index]))
if num > L[mid_index]:
start = mid_index + 1
elif num < L[mid_index]:
stop = mid_index - 1
else:
print('Find it,the index is %s' %mid_index)
return
find(num, L, start, stop)
else: # 如果stop > start则意味着列表已经全部切完,即切为空
print('not exists')
return
find(17,L)


浙公网安备 33010602011771号