本學習筆記**將使用c#重寫。
public void method1()
console.writeline(sum);
}public void method2()
演算法:是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。(1)輸入輸出:演算法具有零個或多個輸入。演算法至少有乙個輸出。
(2)有窮性:指演算法在執行有限的步驟後,自動結束而不會出現無線迴圈,並且每乙個步驟都是在可接受的時間內完成。
(3)確定性:演算法的每乙個步驟都具有確定的含義,不會出現二義性。
(4)可行性:演算法的每一步都必須是可行的,也就是說,每一步都能夠通過有限次數完成。
(1)正確性:
本書將第三層次作為乙個演算法是否正確的標準。(寫演算法時至少要特別注意一些特殊邊界的處理,盡量多考慮一些特殊情況)
(2)可讀性
(4)時間效率高和儲存量低
(1)事後統計法:拿同一套測試資料去測試不同的演算法,通過比較執行時間來確定演算法效率的高低。存在各種問題:浪費時間精力、環境依賴高、測試資料設計困難。
(2)事前分析估計方法
乙個高階程式語言編寫的程式在在計算中執行消耗的時間取決於以下因素:
如對於以下三種演算法,其輸入規模都是n = 100。第一種演算法執行了 2n + 3 次,第二種演算法執行了3次,第三種演算法執行了n²次(忽略迴圈體頭尾的開銷)。
public void method3()
console.writeline(sum); // 執行了1次
}public void method4()
public void method5()
}console.writeline(sum); // 執行了1次
}
如果僅考慮演算法基本操作的數量,忽略迴圈體、初始化等其他不重要操作,對於同樣輸入規模n,第一段**的操作次數f(n) = n,而第二種f(n) = 1,第三種f(n) = n²。因此,重要的是把基本運算元量和輸入規模關聯起來,即基本操作的數量必須表示為輸入規模的函式。如下圖。
f(n) = 2n + 3 和 f(n) = 3n + 1 兩個演算法哪個更好呢?答案:總體上來說前者更好。
函式的漸進增長:給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的 n > n,f(n)總是比g(n)大,那麼我們說f(n)的增長漸進快於g(n)。
比較函式之間的漸進增長時,通常忽略常數的加減法,通常忽略與最高次項相乘的常數,最高次項的指數越大,隨著n的增加,函式增長得越快。因此判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以忽略,而更應該關注主項(最高端項)的階數。
(1)演算法時間複雜度定義:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:t(n) = o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中f(n)是問題規模n的某個函式。
(類似於數學中的同階無窮小,比較的都是增長速度。)
一般情況下,隨著n的增大,t(n)增長最慢的演算法為最優演算法。
非官方名稱:o(1) —> 常數階;o(n) —> 線性階;o(n²) —> 平方階;o(log n) —> 對數階
(2)推導大o階方法
因此,算出乙個演算法的時間複雜度為o(3)是錯誤的,因為並沒有o(3)這種說法,而是o(1)。具體舉例見原書。
(1)最壞情況:是一種時間保證,那就是保證演算法執行時間不可能比這更長。
(2)平均情況:是指所有情況中最有意義的,因為它是期望的執行時間。
一般在沒有特殊說明的情況下,演算法時間複雜度都是指最壞時間複雜度。
演算法空間複雜度定義:是指計算演算法所需的儲存空間,計算公式記作:s(n) = o(f(n)),其中 n 為輸入規模,f(n)為語句關於n所佔儲存空間的函式。
大話資料結構第二章學習筆記
演算法 資料結構與演算法的關係 演算法是什麼?指令的有限序列,每條指令表示乙個或多個操作。演算法能輸入輸出,能自動結束不會無限迴圈,而且每乙個步驟在可接受的時間內完成。好的演算法什麼正確可讀健壯都不算什麼,最重要的是時間效率高和儲存量低。怎麼衡量演算法的效率啊?事前分析估算的方法 時間取決於演算法採...
《大話資料結構》筆記 第二章 演算法(下)
給定兩個函式 f n 和 g n 如果存在乙個整數 n,使得對於所有的 n n,f n 總大於 g n 那麼我們說 f n 的增長漸近快於 g n 例如,演算法 a 要 2n 3 次操作,而演算法 b 要 3n 1 次。隨著 n 的增大,比較執行次數時,我們可以忽略加法常數。再例如,演算法 c 是 ...
老楊《大話資料結構》第二章 演算法
演算法是解決特定問題求解步驟的描述,計算機中表現為指令的有限序列,每條指令表示乙個或者多個操作。輸入輸出 有窮性確定性 可行性正確性 可讀性健壯性 時間效率高和儲存量低 事後統計方法 事前分析估計方法 通過書中所給1 2 99 100的例子,可以明顯對比出幾種不同演算法具有不同的空間和時間開銷。某個...