算法-基礎和查找-1.漢諾塔/2.順序查找/3.二分查找/4.順序查找和二分查找的比較
阿新 • • 發佈:2018-12-28
arc none spl opened spa earch 每次 int 順序
1.漢諾塔:
如下圖所示,需要將A柱子中的所有圓盤按照從小到大的順序移動到C柱子上,並且在移動過程中大圓盤不能在小圓盤上面
分析問題:最終希望呈現的結果是將A柱子上的盤子全部按照從小到大的順序移動到C柱子上
1.n個盤子,將n-1視為一個整體
2.將n-1個盤子視為一個盤子從a經過c移動到b
3.將n從a移動到c
4.將n-1個盤子從b經過a移動到c
5.結束條件:n>0
代碼如下:
1 def hanoi(n, a, b, c): 2 if n > 0: 3 hanoi(n-1, a, c, b)hanoi4 print("move from %s to %s" %(a,c)) 5 hanoi(n-1, b, a, c) 6 7 hanoi(3, ‘A‘, ‘B‘, ‘C‘)
2.順序查找:
問題分析:在一個列表中查找一個元素,從頭開始,找到了返回索引值,找不到返回None或-1
代碼如下:
1 def linear_search(li,val): 2 for index,v in enumerate(li): 3 if v == val: 4 return index 5 elselinear_search: 6 return None 7 8 print(linear_search([2,3,4],4))
3.二分查找:
問題分析:在一個列表中查找一個元素,每次通過中間位置的數值進行查找
1.確定左右的索引,left,right
2.找到中間位置索引,mid = (left+right)//2
3.判斷中間索引位置的值和待查找的值的大小
1.如果相等,則找到,然會返回索引mid
2.如果索引位置的值大於待查找的值,說明待查找的值在mid左側,右索引移動到mid前面的位置
3.如果索引位置的值小於待查找的值,說明待查找的值在mid右側,左索引移動到mid後面的位置
4.上述步驟成立的前提是左索引需要要小於等於右索引,否則返回None
代碼如下:
1 def binary_search(li,val): 2 left = 0 3 right = len(li) - 1 4 while left <= right: # 候選區有值 5 mid = (left + right) // 2 6 if li[mid] == val: 7 return mid 8 elif li[mid] > val: # 待查找的值在mid左側 9 right = mid - 1 10 else: # li[mid] < val 待查找的值在mid右側 11 left = mid + 1 12 else: 13 return None 14 15 print(binary_search([1,2,3,5,6,8,9],5))binary_search
4.順序查找和二分查找的比較:
時間復雜度:
順序查找的時間復雜度為O(n)
二分查找的時間復雜度為O(logn)
測試兩種查找方式代碼運行的時間,引入一個時間測試模塊cal_time如下:
1 # -*- coding:utf-8 -*- 2 3 # 計算時間函數 4 5 import time 6 7 def cal_time(func): 8 def wrapper(*args,**kwargs): 9 t1 = time.time() 10 result = func(*args,**kwargs) 11 t2 = time.time() 12 print("%s running time: %s secs." % (func.__name__,t2 - t1)) 13 return wrappercal_time
測試代碼:
1 # -*- coding:utf-8 -*- 2 from cal_time import * 3 4 ‘‘‘ 5 時間復雜度: 6 順序查找的時間復雜度為O(n) 7 二分查找的時間復雜度為O(logn) 8 9 ‘‘‘ 10 11 @cal_time 12 def linear_search(li,val): 13 for index,v in enumerate(li): 14 if v == val: 15 return index 16 else: 17 return None 18 19 @cal_time 20 def binary_search(li,val): 21 left = 0 22 right = len(li) - 1 23 while left <= right: # 候選區有值 24 mid = (left + right) // 2 25 if li[mid] == val: 26 return mid 27 elif li[mid] > val: # 待查找的值在mid左側 28 right = mid - 1 29 else: # li[mid] < val 待查找的值在mid右側 30 left = mid + 1 31 else: 32 return None 33 34 li = list(range(1000000)) 35 linear_search(li,389000) 36 binary_search(li,389000)test_time
算法-基礎和查找-1.漢諾塔/2.順序查找/3.二分查找/4.順序查找和二分查找的比較