演算法設計是開發解決問題的數學過程。演算法分析是預測演算法的效能。前面兩章介紹了經典的資料結構(列表、堆疊、佇列、優先權佇列、集合和映射)並應用它們來解決問題。本章將使用各種範例來介紹開發高效演算法的常用演算法技術(動態規劃、分而治之和回溯)。
Big O 表示法獲得了一個根據輸入大小測量演算法時間複雜度的函數。您可以忽略函數中的乘法常數和非支配項。假設兩種演算法執行相同的任務,例如搜尋(線性搜尋與二分搜尋)。哪一個比較好?要回答這個問題,您可以實作這些演算法並運行程式以獲得執行時間。但這種方法有兩個問題:
透過測量演算法的執行時間來比較演算法是非常困難的。為了克服這些問題,開發了一種理論方法來分析獨立於計算機和特定輸入的演算法。這種方法近似改變輸入大小的影響。透過這種方式,您可以看到演算法的執行時間隨著輸入大小的增加而增加的速度,因此您可以透過檢查兩個演算法的成長率。
來比較它們考慮線性搜尋。線性搜尋演算法將鍵與陣列中的元素順序進行比較,直到找到鍵或陣列耗盡。如果鍵不在陣列中,則需要將大小為 n 的陣列進行 n 次比較。如果鍵在陣列中,則平均需要 n/2 次比較。此演算法的執行時間與數組的大小成正比。如果將陣列大小加倍,則比較次數也會加倍。該演算法以線性速率增長。成長率的數量級為 n。計算機科學家使用大 O 符號來表示「數量級」。使用此表示法,線性搜尋演算法的複雜度為 O(n),發音為「n 階」。我們將時間複雜度為 O(n) 的演算法稱為線性演算法,並且它呈現線性成長率。
對於相同的輸入大小,演算法的執行時間可能會有所不同,具體取決於輸入。導致執行時間最短的輸入稱為最佳情況輸入,導致執行時間最長的輸入稱為最壞情況輸入。最佳案例分析和
最壞情況分析是分析演算法的最佳情況輸入和最壞情況輸入。最好情況和最壞情況分析不具代表性,但最壞情況分析非常有用。您可以放心,演算法永遠不會比最壞情況慢。
平均情況分析嘗試確定相同大小的所有可能輸入的平均時間量。平均情況分析是理想的,但很難執行,因為對於許多問題來說,很難確定各種輸入實例的相對機率和分佈。最壞情況分析比較容易進行,所以一般都是針對最壞情況進行分析。
線性搜尋演算法在最壞的情況下需要n 次比較,在平均情況下需要n/2 次比較(如果您幾乎總是在尋找列表中已知的內容)。使用 Big O 表示法,兩種情況都需要 O(n) 時間。乘法常數 (1/2) 可以省略。算法分析的重點是成長率。乘法常數對成長率沒有影響。 n/2 或 100_n_ 的成長率與 n 相同,如下表 成長率 所示。因此,O(n) = O(n/2) = O(100n)。
考慮在 n 個元素的陣列中找出最大數字的演算法。如果n為2,則需要比較一次才能找到最大數;如果n為3,則進行兩次比較。一般來說,需要 n - 1 次比較才能找到 n 個元素清單中的最大數量。演算法分析適用於大輸入量。如果輸入量很小,那麼估計演算法的效率就沒有意義。隨著 n 變大,表達式 n - 1 中的 n 部分在複雜性上占主導地位。大 O 表示法允許您忽略非主導部分(例如,
中的 -1
表達式 n - 1)並反白顯示重要部分(例如表達式 n - 1 中的 n)。因此,此演算法的複雜度為O(n)。
Big O 表示法根據輸入大小來估計演算法的執行時間。如果時間與輸入大小無關,則該演算法稱為採用恆定時間,符號為O(1)。例如,檢索數組中給定索引處的元素的方法
需要常數時間,因為時間不會隨著陣列大小的增加而增加。
以下數學求和在演算法分析中通常很有用:
時間複雜度 是使用 Big-O 表示法衡量執行時間的指標。同樣,您也可以使用 Big-O 表示法來測量空間複雜度。 空間複雜度衡量演算法使用的記憶體空間量。書中介紹的演算法大多的空間複雜度都是 O(n)。即,它們對輸入大小表現出線性增長率。例如,線性搜尋的空間複雜度是 O(n)。
以上是開發高效演算法 - 使用大 O 表示法測量演算法效率的詳細內容。更多資訊請關注PHP中文網其他相關文章!