
- 演算法設計與分析
- 首頁
- 演算法基礎
- 演算法導論 - 演算法介紹
- 演算法導論 - 演算法分析
- 演算法導論 - 分析方法
- 演算法導論 - 漸近記號與先驗分析
- 演算法導論 - 時間複雜度
- 演算法導論 - 主定理
- 演算法導論 - 空間複雜度
- 分治法
- 演算法導論 - 分治演算法
- 演算法導論 - 最大最小問題
- 演算法導論 - 歸併排序演算法
- 演算法導論 - Strassen矩陣乘法
- 演算法導論 - Karatsuba演算法
- 演算法導論 - 漢諾塔
- 貪心演算法
- 演算法導論 - 貪心演算法
- 演算法導論 - 旅行商問題
- 演算法導論 - Prim最小生成樹
- 演算法導論 - Kruskal最小生成樹
- 演算法導論 - Dijkstra最短路徑演算法
- 演算法導論 - 地圖著色演算法
- 演算法導論 - 分數揹包問題
- 演算法導論 - 帶截止期限的作業排程
- 演算法導論 - 最優合併模式
- 動態規劃
- 演算法導論 - 動態規劃
- 演算法導論 - 矩陣鏈乘法
- 演算法導論 - Floyd-Warshall演算法
- 演算法導論 - 0-1揹包問題
- 演算法導論 - 最長公共子序列演算法
- 演算法導論 - 使用動態規劃的旅行商問題
- 隨機化演算法
- 演算法導論 - 隨機化演算法
- 演算法導論 - 隨機化快速排序演算法
- 演算法導論 - Karger最小割演算法
- 演算法導論 - Fisher-Yates洗牌演算法
- 近似演算法
- 演算法導論 - 近似演算法
- 演算法導論 - 頂點覆蓋問題
- 演算法導論 - 集合覆蓋問題
- 演算法導論 - 旅行商問題近似演算法
- 排序技術
- 演算法導論 - 氣泡排序演算法
- 演算法導論 - 插入排序演算法
- 演算法導論 - 選擇排序演算法
- 演算法導論 - 希爾排序演算法
- 演算法導論 - 堆排序演算法
- 演算法導論 - 桶排序演算法
- 演算法導論 - 計數排序演算法
- 演算法導論 - 基數排序演算法
- 演算法導論 - 快速排序演算法
- 搜尋技術
- 演算法導論 - 搜尋技術介紹
- 演算法導論 - 線性搜尋
- 演算法導論 - 二分搜尋
- 演算法導論 - 插值搜尋
- 演算法導論 - 跳躍搜尋
- 演算法導論 - 指數搜尋
- 演算法導論 - 斐波那契搜尋
- 演算法導論 - 子列表搜尋
- 演算法導論 - 雜湊表
- 圖論
- 演算法導論 - 最短路徑
- 演算法導論 - 多階段圖
- 演算法導論 - 最優代價二叉搜尋樹
- 堆演算法
- 演算法導論 - 二叉堆
- 演算法導論 - 插入方法
- 演算法導論 - 堆化方法
- 演算法導論 - 提取方法
- 複雜度理論
- 演算法導論 - 確定性計算與非確定性計算
- 演算法導論 - 最大團
- 演算法導論 - 頂點覆蓋
- 演算法導論 - P類和NP類
- 演算法導論 - Cook定理
- 演算法導論 - NP難類和NP完全類
- 演算法導論 - 爬山演算法
- 演算法導論實用資源
- 演算法導論 - 快速指南
- 演算法導論 - 有用資源
- 演算法導論 - 討論
演算法分析
在演算法的理論分析中,通常以漸近意義估計其複雜度,即估計任意大的輸入的複雜度函式。 “演算法分析”這一術語由唐納德·克努特提出。
演算法分析是計算複雜度理論中的重要組成部分,它為解決特定計算問題所需的演算法資源提供了理論估計。大多數演算法的設計都是為了處理任意長度的輸入。演算法分析是確定執行演算法所需的時間和空間資源量。
通常,演算法的效率或執行時間表示為一個函式,該函式將輸入長度與步數(稱為時間複雜度)或記憶體容量(稱為空間複雜度)相關聯。
分析的必要性
本章將討論演算法分析的必要性以及如何為特定問題選擇更好的演算法,因為一個計算問題可以用不同的演算法來解決。
透過考慮特定問題的演算法,我們可以開始發展模式識別能力,以便藉助該演算法解決類似型別的問題。
演算法之間通常大相徑庭,儘管這些演算法的目標相同。例如,我們知道可以使用不同的演算法對一組數字進行排序。對於相同的輸入,一種演算法執行的比較次數可能與其他演算法不同。因此,這些演算法的時間複雜度可能會有所不同。同時,我們需要計算每種演算法所需的記憶體空間。
演算法分析是對演算法解決問題的能力進行分析的過程,包括所需時間和空間(實現時儲存所需的記憶體大小)。然而,演算法分析的主要關注點是所需時間或效能。通常,我們執行以下型別的分析:
最壞情況 - 對大小為a的任何例項所採取的最大步數。
最好情況 - 對大小為a的任何例項所採取的最小步數。
平均情況 - 對大小為a的任何例項所採取的平均步數。
均攤 - 應用於大小為a的輸入的一系列操作隨時間的平均值。
為了解決問題,我們需要考慮時間和空間複雜度,因為程式可能在一個記憶體有限但空間充足的系統上執行,或者反之亦然。 在這種情況下,如果我們比較氣泡排序和歸併排序。氣泡排序不需要額外的記憶體,但歸併排序需要額外的空間。儘管氣泡排序的時間複雜度高於歸併排序,但如果程式需要在記憶體非常有限的環境中執行,我們可能需要應用氣泡排序。
增長率
增長率定義為當輸入大小增加時演算法執行時間增加的速率。
增長率可分為兩種型別:線性型和指數型。如果演算法隨著輸入大小的增加而線性增加,則為線性增長率。如果演算法的執行時間隨著輸入大小的增加而呈指數增加,則為指數增長率。
證明演算法的正確性
一旦設計出解決問題的演算法,就非常重要的一點是該演算法必須始終為給定的每個輸入返回期望的輸出。因此,需要證明所設計的演算法的正確性。這可以使用多種方法完成:
反例證明
確定演算法可能不正確的案例並應用。如果反例適用於該演算法,則證明了其正確性。否則,必須設計另一個解決此反例的演算法。
歸納證明
使用數學歸納法,我們可以透過證明演算法對於基本情況輸入(例如1)是正確的,並假設它對於另一個輸入k是正確的,然後證明它對於k+1也是正確的,從而證明演算法對於所有輸入都是正確的。
迴圈不變式證明
找到一個迴圈不變式k,證明基本情況對於演算法中的迴圈不變式成立。然後應用數學歸納法來證明演算法的其餘部分是正確的。