演算法?

半紙淵發表於2017-12-14

本文內容:
1、什麼是演算法?
2、演算法分析基礎?
3、文集列表

建議資料結構和演算法分開來學,這裡只有演算法,沒有什麼是資料結構!資料結構在這裡; --->> 點我


1、什麼是演算法?

演算法:是一系列指令,是指一系列解決問題的明確指令;給定規範的輸入,有限時間內會獲得要求的輸出;--【演算法設計與分析基礎】

Wiki : In mathematics and computer science, an algorithm is an unambiguous specification of how to solve a class of problems. [ 在數學與電腦科學領域裡面,演算法是指解決一類問題的明確規範。]

ME : 其實不管是指令還是規範,演算法就是解決問題的方法,但這個方法是明確的,明確不代表唯一;

圖解:

演算法設計與分析基礎

看看別人的答案: Wiki-Algorithm

學習演算法?: 知乎-怎樣學演算法 知乎-有哪些學習演算法的網站推薦? 知乎-如何系統地學習演算法?

國外視訊教程: Coursera-普林斯頓大學【Part I】 Coursera-普林斯頓大學【Part II】

練習演算法的網站: LeetCode hihoCoder LintCode


2、演算法分析基礎?

這話很好!

演算法分析:指對演算法執行時間與儲存空間的效率的研究;

時間效率也被稱為時間複雜度,指出正在執行的程式執行得多快;

空間效率也被稱為空間複雜度,指出正在執行的程式佔用多少儲存空間;

執行時間度量單位

演算法?
cop: 指計算機一個演算法基本操作的執行時間【近似值】; C(n): 指演算法需要執行基本操作的次數; n: 指輸入的規模;

增長次數,而執行時間分析裡面,顯然最重要的就是 C(n) 的分析:

不同的 C(n)
從表可以看出,log n 是增長速度最慢的,而 2n / n ! 都是增長飛速的;

最差情況、平均情況、最優情況 最差情況:當輸入規模為 n 時,演算法在最壞情況下的效率; 【即,當輸入規模為 n 時,那種型別的輸入會導致基本操作次數 ( C(n) ) 達到最大值】【Cworst ( n ) 】

最優情況:當輸入規模為 n 時,演算法在最優情況下的效率; 【即,當輸入規模為 n 時,那種型別的輸入會導致基本操作次數 ( C(n) ) 達到最小值】

平均情況:當輸入規模為 n 時,演算法在平均情況下的效率; 【即,當輸入規模為 n 時,隨機型別的輸入導致的基本操作次數 ( C(n) ) 的平均值】【即為,通常情況下的操作次數】

研究的重點

演算法?

三個漸近符號:[ Ο ] [ Ω ] [ Θ ] 漸近符,是為了簡化函式,分析影響函式增加次數最大的部分;

注意

[ Ο ] [ 讀:歐 ] :【小於等於號】 定義:

演算法?

圖示:

演算法?

[ Ω ] [ 讀:歐妹(mei 第一聲)嘎( omega 美[oʊˈmegə] ) ]:【大於等於號】 定義:

演算法?

圖示:

演算法?

[ Θ ] [ 讀:嘚(dei 第一聲)塔( theta 美[ˈθetə, ˈθi-] ) ]:【等於號、區間號】 定義:

演算法?

圖示:

演算法?

漸近符定理:

演算法?

基本漸近效率型別:

演算法?

(非)遞迴演算法的數學分析:

  • 非遞迴演算法的數學分析方案:

    演算法?

  • Ep 1:

    演算法?

解析:
1、確定輸入規模:就是陣列的個數 n ;

2、確定核心基本操作:函式功能是得到最大值,而得到最大值的核心就是比較誰更大,即對應函式的 if A[i] > maxval ;

3、確定核心基本操作是否只依賴於輸入規模:if A[i] > maxval 其中 i 就是屬於 [0 ~ n - 1],maxval 就是 A[i] 的一個值,而且 if 的頂層 for 迴圈是從 0 ~ n - 1 的迴圈也同樣只依賴於輸入規模 n ,所以基本操作只依賴於輸入規模 n ;

4、建立求和表示式:因為每一次的 for 迴圈都要執行一次 if 比較,即核心基本操作的執行次數就等於 for 迴圈的迴圈次數,即 n-1 ; 則有:C(n) = (n - 1) * 1 = n- 1 ;

5、得到閉合公式或增長次數:C(n) = n - 1 ∈ Θ(n) ;

  • 遞迴演算法的數學分析方案:

    演算法?

  • Ep:

    演算法?

解析:
1、確定輸入規模:就是陣列的個數 n ;

2、確定核心基本操作:函式功能是得到某個數的階乘,而階乘就是做連續的乘法,即對應函式的 F(n - 1) * n ,即乘法是基本操作;

3、檢查基本操作在不同的輸入下的執行情況,顯然這裡的輸入不管那種型別,乘法運算還是那個乘法運算;

4、建立遞推關係與初始條件: 初始條件就是遞迴停止的條件,這裡是 if n = 0; 遞推式:

演算法?
M(n - 1) : 對應 F(n - 1) 的執行次數; 1 : 對應 F(n - 1) * n 的執行次數; 因為終止條件成立的時候,沒有執行乘法操作,所以 M(0) = 0 ;

5、解遞推式:M(n) = M(n - 1) + 1 ; 反向替換法[都不知道從那裡來的]:

演算法?
最終結果

演算法的經驗分析

演算法?

還有一個是演算法視覺化的方法來做演算法分析,知道就好;


3、文集列表


參考書籍/文章:

書籍:《演算法設計與分析基礎 美 萊維汀 第3版》
書籍:《演算法(第四版)》
書籍:《演算法精解_C語言描述(中文版)》
書籍:《資料結構與演算法分析—C語言描述》
書籍:《演算法圖解》
書籍:《演算法導論(原書第3版) 中文完整版》
書籍:《啊哈!演算法》

文章:《七大查詢演算法》


如有錯漏,還望指出,不勝感激!

相關文章