1. 程式人生 > 實用技巧 >方法:推導大O階

方法:推導大O階

進行演算法效率的度量有 “事後統計方法” 和 “事前分析估算方法” 兩種。

其中, “事後統計方法” 需要設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。

而 “事前分析估算方法” 是在計算機程式編制前,依據統計方法對演算法進行估算。

“事後統計方法” 顯然有很大缺陷,例如必須依據演算法事先編制好程式(需要花費大量的時間和精力)、時間的比較依賴計算機硬體和軟體等環境因素(有時會掩蓋演算法本身的優劣)、演算法的測試資料設計困難且程式的執行時間與測試資料規模有很大關係(效率高的演算法在小的測試資料面前往往得不到體現)。

“事前分析估算方法” 是通過分析,發現一個用高階程式語言編寫的程式在計算機上執行時所消耗的時間取決於以下因素:
1.演算法採用的策略、方法。
2.編譯產生的程式碼質量。(由軟體支援,如編譯器優化等級)
3.問題的輸入規模。
4.機器執行指令的速度。(由硬體效能決定)
也就是說,拋開這些與計算機軟硬體有關的因素,一個程式的執行時間,依賴於演算法的好壞和問題的輸入規模。所謂問題輸入規模是指輸入量的多少。

分析一個演算法的時間複雜度,等同於推導大O階,其推導方法如下:
1.用常數 1 取代執行時間中的所有加法常數。
2.在修改後的執行次數函式中,只保留最高階項。
3.如果最高階項存在且不是 1,則去除與這個項相乘的常數。
得到的結果就是大O階。

示例:

int i, j, x=0, sum=0, n=100;  // 執行 1 次
for (i=1; i<=n; i++)
{
    for (j=1; j<=n; j++)
    {
        x++;                  // 執行 n * n 次
        sum = sum + x;
    }
}
printf("%d", sum);            // 執行 1 次

該程式碼執行時間為 1 + n² + 1,根據推導方法步驟 1 將其計算得到 1 + n² + 1,接著根據步驟 2 得到 ,再根據步驟 3 得到
當熟練推導大O階之後,像這種情況可以直接得出大O階為 O(n²)。

提示:如果不理解大O階的存在意義,可以去了解函式的漸近增長。

以上筆記摘抄於書籍《大話資料結構》