Python笔记四(二分查找)

1、算法:计算一些比较复杂的问题,所采用的 在空间(内存)上 或 时间上(执行时间) 更有优势的方法。

2、常用的算法:

排序(快速排序、冒泡排序、堆排序)

查找

3、二分查找:想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模。

备注:解决有序的数字集合的查找问题

 1 #练习1
 2 l=[1,2,10,30,33,99,101,200,301,402] #从小到大排列的数字列表
 3 
 4 def search(num,l):
 5     print(l)
 6     if len(l) > 0:
 7         mid=len(l)//2
 8         if num > l[mid]:
 9             #in the right
10             l=l[mid+1:]
11         elif num < l[mid]:
12             #in the left
13             l=l[:mid]
14         else:
15             print('find it')
16             return
17         search(num,l)
18     else:
19         #如果值不存在,则列表切为空
20         print('not exists')
21         return
22 search(100,l)
23 #输出结果
24 # >>>[1, 2, 10, 30, 33, 99, 101, 200, 301, 402]
25 # >>>[101, 200, 301, 402]
26 # >>>[101, 200]
27 # >>>[101]
28 # >>>[]
29 # not exists
30 
31 
32 #练习2
33 l=[1,2,10,30,33,99,101,200,301,402]
34 
35 def search(num,l,start=0,stop=None):
    #if stop is None else stop
stop = len(l)-1 if stop is None else stop
36 if start <= stop: 37 mid=start+(stop-start)//2 38 print('start:[%s] stop:[%s] mid:[%s] mid_val:[%s]' %(start,stop,mid,l[mid])) 39 if num > l[mid]: 40 start=mid+1 41 elif num < l[mid]: 42 stop=mid-1 43 else: 44 print('find it',mid) 45 return mid 46 search(num,l,start,stop) 47 else: #如果stop > start则意味着列表实际上已经全部切完,即切为空 48 print('not exists') 49 return None 50 51 search(301,l) 52 #输出结果 53 # >>>start:[0] stop:[9] mid:[4] mid_val:[33] 54 # >>>start:[5] stop:[9] mid:[7] mid_val:[200] 55 # >>>start:[8] stop:[9] mid:[8] mid_val:[301] 56 # >>>find it 8

猜你喜欢

转载自www.cnblogs.com/xingye-mdd/p/8977651.html
今日推荐