本文內容:
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) 的分析:
從表可以看出,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
;
遞推式:
5、解遞推式:M(n) = M(n - 1) + 1 ; 反向替換法[都不知道從那裡來的]:
演算法的經驗分析
還有一個是演算法視覺化的方法來做演算法分析,知道就好;
3、文集列表
-
排序演算法
《演算法:氣泡排序》
《演算法:選擇排序、插入排序、希爾排序》(未寫)
《演算法:歸併排序》(未寫)
《演算法:快速排序》(未寫)
《演算法:堆排序》(未寫)
《演算法:計數排序》(未寫)
《演算法:桶排序》(未寫)
《演算法:基數排序》(未寫) -
查詢演算法
《演算法:順序查詢》(未寫)
《演算法:二分查詢》(未寫)
《演算法:插值查詢》(未寫)
《演算法:斐波那契查詢》(未寫)
《演算法:樹表查詢》(未寫)
《演算法:分塊查詢》(未寫)
《演算法:雜湊查詢》(未寫) -
圖論演算法
《演算法:圖論基礎,無向圖、有向圖》(未寫)
《演算法:深度優先搜尋 [ 無向圖 ] 》(未寫)
《演算法:廣度優先搜尋 [ 無向圖 ] 》(未寫)
《演算法:狄克斯特拉演算法 [加權圖] 》(未寫)
《演算法:最小生成樹 [ 加權無向圖 ]》(未寫)
《演算法:最短路徑(旅行商問題) [ 加權有向圖 ]》(未寫)
《演算法:拓撲排序 [ 有向無環圖 ] 》(未寫)
《演算法:網路流(最大流) [ 有向圖 ]》(未寫)
《演算法:NP 完全性(多項式、揹包問題) [ 有向圖 ]》(未寫)
《演算法:匈牙利方法(分配問題)》(未寫)
《演算法:近似演算法》(未寫) -
數論演算法
《演算法:數論基礎》(未寫)
《演算法:最大公約數》(未寫)
《演算法:模運算》(未寫)
《演算法:解模線性方程》(未寫)
《演算法:中國餘數定理》(未寫)
《演算法:元素的冪》(未寫)
《演算法:多項式插入》(未寫)
《演算法:最小二乘估計法》(未寫)
《演算法:方程求解》(未寫) -
幾何演算法
《演算法:線段相交》(未寫)
《演算法:凸包問題》(未寫)
《演算法:最近對問題》(未寫)
《演算法:球面弧長》(未寫) -
正規表示式
《演算法:正規表示式簡述》(未寫) -
多執行緒、矩陣運算
《演算法:多執行緒實現》(未寫)
《演算法:矩陣運算》(未寫) -
演算法技巧
《演算法:貪婪演算法》(未寫)
《演算法:分治演算法》(未寫)
《演算法:動態規劃》(未寫)
《演算法:隨機化演算法》(未寫)
《演算法:回溯演算法》(未寫)
參考書籍/文章:
書籍:《演算法設計與分析基礎 美 萊維汀 第3版》
書籍:《演算法(第四版)》
書籍:《演算法精解_C語言描述(中文版)》
書籍:《資料結構與演算法分析—C語言描述》
書籍:《演算法圖解》
書籍:《演算法導論(原書第3版) 中文完整版》
書籍:《啊哈!演算法》
文章:《七大查詢演算法》
如有錯漏,還望指出,不勝感激!