演算法的效率衡量

2021-08-14 20:30:37 字數 1878 閱讀 6877

演算法效率衡量

先來看一道題:

如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b、c可能的組合?

執行時間反應演算法效率

對於同一問題,我們給出了兩種解決演算法,在兩種演算法的實現中,我們對程式執行的時間進行了測算,發現兩段程式執行的時間相差懸殊(214.583347秒相比於0.182897秒),由此我們可以得出結論:

實現演算法程式的執行時間可以反應出演算法的效率,即演算法的優劣。

單靠時間值絕對可信嗎?

假設我們將第二次嘗試的演算法程式執行在一台配置古老效能低下的計算機中,情況會如何?很可能執行的時間並不會比在我們的電腦中執行演算法一的214.583347秒快多少。

單純依靠執行的時間來比較演算法的優劣並不一定是客觀準確的!

程式的執行離不開計算機環境(包括硬體和作業系統),這些客觀原因會影響程式執行的速度並反應在程式的執行時間上。那麼如何才能客觀的評判乙個演算法的優劣呢?

時間複雜度與「大o記法」

我們假定計算機執行演算法每乙個基本操作的時間是固定的乙個時間單位,那麼有多少個基本操作就代表會花費多少時間單位。算然對於不同的機器環境而言,確切的單位時間是不同的,但是對於演算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響而客觀的反應演算法的時間效率。

對於演算法的時間效率,我們可以用「大o記法」來表示。

「大o記法」:對於單調的整數函式f,如果存在乙個整數函式g和實常數c>0,使得對於充分大的n總有f(n)<=c*g(n),就說函式g是f的乙個漸近函式(忽略常數),記為f(n)=o(g(n))。也就是說,在趨向無窮的極限意義下,函式f的增長速度受到函式g的約束,亦即函式f與函式g的特徵相似。

時間複雜度:假設存在函式g,使得演算法a處理規模為n的問題示例所用時間為t(n)=o(g(n)),則稱o(g(n))為演算法a的漸近時間複雜度,簡稱時間複雜度,記為t(n)

如何理解「大o記法」

對於演算法進行特別具體的細緻分析雖然很好,但在實踐中的實際價值有限。對於演算法的時間性質和空間性質,最重要的是其數量級和趨勢,這些是分析演算法效率的主要部分。而計量演算法基本運算元量的規模函式中那些常量因子可以忽略不計。例如,可以認為3n2和100n2屬於同乙個量級,如果兩個演算法處理同樣規模例項的代價分別為這兩個函式,就認為它們的效率「差不多」,都為n2級。

最壞時間複雜度

分析演算法時,存在幾種可能的考慮:

對於最優時間複雜度,其價值不大,因為它沒有提供什麼有用資訊,其反映的只是最樂觀最理想的情況,沒有參考價值。

對於最壞時間複雜度,提供了一種保證,表明演算法在此種程度的基本操作中一定能完成工作。

對於平均時間複雜度,是對演算法的乙個全面評價,因此它完整全面的反映了這個演算法的性質。但另一方面,這種衡量並沒***,不是每個計算都能在這個基本操作內完成。而且,對於平均情況的計算,也會因為應用演算法的例項分布可能並不均勻而難以計算。

因此,我們主要關注演算法的最壞情況,亦即最壞時間複雜度。

時間複雜度的幾條基本計算規則

基本操作,即只有常數項,認為其時間複雜度為o(1)

順序結構,時間複雜度按加法進行計算

迴圈結構,時間複雜度按乘法進行計算

分支結構,時間複雜度取最大值

判斷乙個演算法的效率時,往往只需要關注運算元量的最高次項,其它次要項和常數項可以忽略

在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度

演算法效率的衡量

假設對於同一問題,我們給出了兩種解決演算法,在兩種演算法的實現中,我們對程式執行的時間進行了測算,發現兩段程式執行的時間相差懸殊,由此我們可以得出結論 實現演算法程式的執行時間可以反應出演算法的效率,即演算法的優劣。單靠時間值絕對可信嗎?假設我們將第二次嘗試的演算法程式執行在一台配置古老效能低下的計...

如何衡量測試效率

以系統測試發現缺陷的數量來衡量測試人員的系統測試效率,就好像拿開發人員的 行數衡量開發人員的開發效率一樣,無法客觀有效的反映測試人員的工作質量和工作效率。優點 以bug數量為基礎,有乙個明確而清晰的度量標準 缺點 欠缺力度和有效尺度,不能真正反映當前系統的質量狀況 原因 1 乙個點型的例子,主業務流...

演算法的衡量

什麼是演算法?用來處理運算和邏輯的問題的 塊 執行時間的長短和占用記憶體空間的大小是衡量演算法好壞的重要標準 執行時間長短用時間複雜度來衡量 執行占用記憶體空間的大小用空間複雜度衡量 時間複雜度與空間複雜度 1.時間複雜度 即漸進時間複雜度,用o表示 時間複雜度就是程式的相對執行時間函式t n 簡化...