一、什么是算法?
- 算法(Algorithm):一個計算過程,解決問題的方法
一個算法應該具有以下七個重要的特征:
- ①有窮性(Finiteness):算法的有窮性是指算法必須能在執行有限個步驟之后終止;
- ②確切性(Definiteness):算法的每一步驟必須有確切的定義;
- ③輸入項(Input):一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸 入是指算法本身定出了初始條件;
- ④輸出項(Output):一個算法有一個或多個輸出,以反映對輸入數據加工后的結果。沒 有輸出的算法是毫無意義的;
- ⑤可行性(Effectiveness):算法中執行的任何計算步驟都是可以被分解為基本的可執行 的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性);
- ⑥高效性(High efficiency):執行速度快,占用資源少;
- ⑦健壯性(Robustness):對數據響應正確。
二、時間復雜度:參考鏈接
1、時間復雜度舉例說明
時間復雜度:就是用來評估算法運行時間的一個式子(單位)。一般來說,時間復雜度高的算法比復雜度低的算法慢。
類比生活中的一些時間,估計時間:
現在我們來說說下面這些代碼的時間復雜度是多少呢?
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的時候會輸出:如下圖
# 這時候可以發現規律:
2、常見的算法時間復雜度(按照效率)由小到大依次為:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<O(n2logn)< Ο(n3)<…<Ο(2^n)<Ο(n!)
例如:

由圖中我們可以看出,當 n 趨於無窮大時, O(nlogn) 的性能顯然要比 O(n^2) 來的高
一般來說,只要算法中不存在循環語句,其時間復雜度就是 O(1)
而時間復雜度又分為三種:
- 最優時間復雜度 (Best-Case)
- 平均時間復雜度 (Average-Case)
- 最差時間復雜度 (Worst-Case)
最差時間復雜度的分析給了一個在最壞情況下的時間復雜度情況,這往往比平均時間復雜度好計算,而最優時間復雜度一般沒什么用,因為沒人會拿一些特殊情況去評判這個算法的好壞。
3、如何一眼判斷時間復雜度?
- 循環減半的過程-》O(logn)
- 幾次循環就是n的幾次方的復雜度
三、空間復雜度
空間復雜度:用來評估算法內存占用大小的一個式子
四、對於遞歸的簡單復習
1、遞歸最大的兩個特點:
- 調用自身
- 結束條件
2、做個小練習來判斷一下下面那些函數是遞歸函數?
3、遞歸練習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