1. 程式人生 > >算法-基礎和查找-1.漢諾塔/2.順序查找/3.二分查找/4.順序查找和二分查找的比較

算法-基礎和查找-1.漢諾塔/2.順序查找/3.二分查找/4.順序查找和二分查找的比較

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)
4 print("move from %s to %s" %(a,c)) 5 hanoi(n-1, b, a, c) 6 7 hanoi(3, A, B, C)
hanoi

2.順序查找:

  問題分析:在一個列表中查找一個元素,從頭開始,找到了返回索引值,找不到返回None或-1

  代碼如下:

技術分享圖片
1 def linear_search(li,val):
2     for index,v in enumerate(li):
3         if v == val:
4             return index
5     else
: 6 return None 7 8 print(linear_search([2,3,4],4))
linear_search

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 wrapper
cal_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.順序查找和二分查找的比較