1. 程式人生 > >算法基礎

算法基礎

inf algorithm pytho 輸入 舉例 ID orm code 漢諾塔問題

一、什麽是算法?

  •  算法(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

算法基礎