
- 演算法設計與分析
- 首頁
- 演算法基礎
- DAA - 演算法導論
- DAA - 演算法分析
- DAA - 分析方法
- DAA - 漸進符號與先驗分析
- DAA - 時間複雜度
- DAA - 主定理
- DAA - 空間複雜度
- 分治法
- DAA - 分治演算法
- DAA - 最大最小問題
- DAA - 歸併排序演算法
- DAA - Strassen矩陣乘法
- DAA - Karatsuba演算法
- DAA - 漢諾塔
- 貪心演算法
- DAA - 貪心演算法
- DAA - 旅行商問題
- DAA - Prim最小生成樹
- DAA - Kruskal最小生成樹
- DAA - Dijkstra最短路徑演算法
- DAA - 地圖著色演算法
- DAA - 分數揹包問題
- DAA - 帶截止日期的作業排序
- DAA - 最佳合併模式
- 動態規劃
- DAA - 動態規劃
- DAA - 矩陣鏈乘法
- DAA - Floyd-Warshall演算法
- DAA - 0-1揹包問題
- DAA - 最長公共子序列演算法
- DAA - 使用動態規劃的旅行商問題
- 隨機化演算法
- DAA - 隨機化演算法
- DAA - 隨機化快速排序演算法
- DAA - Karger最小割演算法
- DAA - Fisher-Yates洗牌演算法
- 近似演算法
- DAA - 近似演算法
- DAA - 頂點覆蓋問題
- DAA - 集合覆蓋問題
- DAA - 旅行商近似演算法
- 排序技術
- DAA - 氣泡排序演算法
- DAA - 插入排序演算法
- DAA - 選擇排序演算法
- DAA - 希爾排序演算法
- DAA - 堆排序演算法
- DAA - 桶排序演算法
- DAA - 計數排序演算法
- DAA - 基數排序演算法
- DAA - 快速排序演算法
- 搜尋技術
- DAA - 搜尋技術介紹
- DAA - 線性搜尋
- DAA - 二分搜尋
- DAA - 插值搜尋
- DAA - 跳躍搜尋
- DAA - 指數搜尋
- DAA - 斐波那契搜尋
- DAA - 子列表搜尋
- DAA - 雜湊表
- 圖論
- DAA - 最短路徑
- DAA - 多階段圖
- DAA - 最佳代價二叉搜尋樹
- 堆演算法
- DAA - 二叉堆
- DAA - 插入方法
- DAA - 堆化方法
- DAA - 提取方法
- 複雜度理論
- DAA - 確定性與非確定性計算
- DAA - 最大團
- DAA - 頂點覆蓋
- DAA - P類和NP類
- DAA - 庫克定理
- DAA - NP難和NP完全類
- DAA - 爬山演算法
- DAA有用資源
- DAA - 快速指南
- DAA - 有用資源
- DAA - 討論
分析方法
為了衡量演算法的資源消耗,使用了不同的策略,如本章所述。
漸近分析
函式f(n)的漸近行為是指n變大時f(n)的增長情況。
我們通常忽略n的小值,因為我們通常感興趣的是估計程式在大型輸入上的執行速度。
一個好的經驗法則是,漸近增長率越慢,演算法越好。儘管這並不總是正確的。
例如,線性演算法$f(n) = d * n + k$在漸近意義上總是優於二次演算法$f(n) = c.n^2 + q。
求解遞推方程
遞推關係是一個用較小輸入上的函式值來描述函式的方程或不等式。遞推關係通常用於分治正規化。
讓我們考慮T(n)為大小為n的問題的執行時間。
如果問題規模足夠小,例如n < c,其中c是一個常數,則直接解法需要常數時間,寫成θ(1)。如果問題的劃分產生了一些大小為$\frac{n}{b}$的子問題。
為了解決這個問題,所需時間為a.T(n/b)。如果我們考慮劃分所需的時間為D(n),組合子問題結果所需的時間為C(n),則遞推關係可以表示為 -
$$T(n)=\begin{cases}\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\theta(1) & if\:n\leqslant c\\a T(\frac{n}{b})+D(n)+C(n) & otherwise\end{cases}$$
可以使用以下方法求解遞推關係 -
代入法 - 在這種方法中,我們猜測一個界限,並使用數學歸納法證明我們的假設是正確的。
遞迴樹法 - 在這種方法中,形成一個遞迴樹,其中每個節點代表成本。
主定理 - 這是另一種找到遞推關係複雜度的重要技術。
攤還分析
攤還分析通常用於執行一系列類似操作的某些演算法。
攤還分析提供整個序列的實際成本的上界,而不是分別對操作序列的成本進行邊界限制。
攤還分析不同於平均情況分析;機率不涉及攤還分析。攤還分析保證了最壞情況下每個操作的平均效能。
它不僅僅是一個分析工具,它是一種思考設計的思路,因為設計和分析是密切相關的。
聚合方法
聚合方法提供了問題的全域性檢視。在這種方法中,如果n個操作總共需要最壞情況時間T(n)。那麼每個操作的攤還成本為T(n)/n。雖然不同的操作可能需要不同的時間,但在這種方法中忽略了變化的成本。
記賬方法
在這種方法中,根據操作的實際成本為不同的操作分配不同的費用。如果操作的攤還成本超過其實際成本,則將差額作為信用分配給物件。此信用有助於支付攤還成本低於實際成本的後續操作。
如果第ith個操作的實際成本和攤還成本為$c_{i}$和$\hat{c_{l}}$,則
$$\displaystyle\sum\limits_{i=1}^n \hat{c_{l}}\geqslant\displaystyle\sum\limits_{i=1}^n c_{i}$$
勢能方法
此方法將預付工作表示為勢能,而不是將預付工作視為信用。這種能量可以釋放出來支付未來的操作。
如果我們執行n個操作,從初始資料結構D0開始。讓我們考慮ci為實際成本,Di為第ith個操作的資料結構。勢函式Ф對映到一個實數Ф(Di),即Di的相關勢能。攤還成本$\hat{c_{l}}$可以定義為
$$\hat{c_{l}}=c_{i}+\Phi (D_{i})-\Phi (D_{i-1})$$
因此,總的攤還成本為
$$\displaystyle\sum\limits_{i=1}^n \hat{c_{l}}=\displaystyle\sum\limits_{i=1}^n (c_{i}+\Phi (D_{i})-\Phi (D_{i-1}))=\displaystyle\sum\limits_{i=1}^n c_{i}+\Phi (D_{n})-\Phi (D_{0})$$
動態表
如果為表分配的空間不足,則必須將表複製到更大的表中。類似地,如果從表中刪除了大量成員,則最好將表重新分配為更小的尺寸。
使用攤還分析,我們可以證明插入和刪除的攤還成本是常數,並且動態表中未使用的空間永遠不會超過總空間的常數部分。
在本教程的下一章中,我們將簡要討論漸近符號。