1、什麼是算法?
- 算法(Algorithm):一個計算過程,解決問題的方法
-
一個算法應該具備如下七個重要的特徵:html
- ①有窮性(Finiteness):算法的有窮性是指算法必須能在執行有限個步驟以後終止;
- ②確切性(Definiteness):算法的每一步驟必須有確切的定義;
- ③輸入項(Input):一個算法有0個或多個輸入,以刻畫運算對象的初始狀況,所謂0個輸入是指算法自己定出了初始條件;
- ④輸出項(Output):一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的算法是毫無心義的;
- ⑤可行性(Effectiveness):算法中執行的任何計算步驟都是能夠被分解爲基本的可執行的操做步,即每一個計算步均可以在有限時間內完成(也稱之爲有效性);
- ⑥高效性(High efficiency):執行速度快,佔用資源少;
- ⑦健壯性(Robustness):對數據響應正確。
2、時間複雜度:參考連接
一、時間複雜度舉例說明python
時間複雜度:就是用來評估算法運行時間的一個式子(單位)。通常來講,時間複雜度高的算法比複雜度低的算法慢。算法
類比生活中的一些時間,估計時間:函數
如今咱們來講說下面這些代碼的時間複雜度是多少呢?post
print('hello world') print('hello python') print('hrllo ssd ') #O(1) 大O,簡而言之能夠認爲它的含義是「order of」(大約是)。 # for i in range(n): print('hello world') for j in range(n): print('hello world') #O(n^2) for i in range(n): for j in range(i): print('hrllo owd') ##O(n^2) n= 64 while n>1: print(n) #O(log2n)或者O(logn) n = n//2 # while的分析思路: # 假如n = 64的時候會輸出:以下圖
# 這時候能夠發現規律:
二、常見的算法時間複雜度(按照效率)由小到大依次爲:性能
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<O(n2logn)< Ο(n3)<…<Ο(2^n)<Ο(n!)url
例如:spa
由圖中咱們能夠看出,當 n 趨於無窮大時, O(nlogn) 的性能顯然要比 O(n^2) 來的高3d
通常來講,只要算法中不存在循環語句,其時間複雜度就是 O(1)code
而時間複雜度又分爲三種:
- 最優時間複雜度 (Best-Case)
- 平均時間複雜度 (Average-Case)
- 最差時間複雜度 (Worst-Case)
最差時間複雜度的分析給了一個在最壞狀況下的時間複雜度狀況,這每每比平均時間複雜度好計算,而最優時間複雜度通常沒什麼用,由於沒人會拿一些特殊狀況去評判這個算法的好壞。
三、如何一眼判斷時間複雜度?
- 循環減半的過程-》O(logn)
- 幾回循環就是n的幾回方的複雜度
3、空間複雜度
空間複雜度:用來評估算法內存佔用大小的一個式子
4、對於遞歸的簡單複習
一、遞歸最大的兩個特色:
- 調用自身
- 結束條件
二、作個小練習來判斷一下下面那些函數是遞歸函數?
三、遞歸練習1
代碼實現
def fun(n): if n>0: print("抱着",end="") fun(n-1) print("的我",end="") else: print("個人小鯉魚",end="") fun(4)
遞歸練習2:漢諾塔問題
解決思路:
假設有n個盤子:
- 1.把n-1個圓盤從A通過C移動到B
- 2.把第n個圓盤從A移動到C
- 3.把n-1個小圓盤從B通過A移動到C
代碼實現:
def func(n,a,b,c): if n==1: print(a,'-->',c) else: func(n-1,a,c,b) #將n-1個盤子從a通過c移動到b print(a,'-->',c) #將剩餘的最後一個盤子從a移動到c func(n-1,b,a,c) #將n-1個盤子從b通過a移動到c n = int(input('請輸入漢諾塔的層數:')) func(n,'柱子A','柱子B','柱子C')
總結:漢諾塔移動次數的遞推式:h(x)=2h(x-1)+1