什麼是演算法?

一、演算法定義:
對特定問題糾結步驟的一種描述;它是指令的有限序列,其中每條指令表示一個或多個操作
二、5個重要特性:
- 有窮性
一個演算法必須總是(對任何合法的輸入)在執行有窮步後結束,且每步都可以在有窮時間內完成。
- 確定性
演算法中的每條指令必須有確切的含義,讀者理解時不會產生二義性。並且在任何條件下,演算法只有唯一的一條執行路徑,即對於相同的輸入只能得出相同的輸出。
- 可行性
一個演算法是能行的,即演算法中描述的操作都是可以通過已經實現的基本運算執行有限次實現。
- 輸入
一個演算法有 零個 或 多個輸入 ,這些輸入取自某個特定的物件的集合。
- 輸出
一個演算法有一個或多個的輸出,這些輸出是同輸入有著特定的關係的量。

11.png
三、演算法設計的要求
-
1、正確性
演算法應當滿足具體問題的需求,能夠通過特定的問題測試。
-
2、可讀性
演算法主要是為了人的閱讀與交流,其次才是機器的執行
-
3、健壯性
當輸入非法的資料時,演算法也能狗適當做出反應或進行處理,而不會產生莫名奇妙的輸出結果
-
4、效率與低儲存量需求
效率指演算法執行的時間,執行時間短效率高;儲存量需求是指演算法執行過程中所需的最大儲存空間。
二者都與問題的規模相關,同時也要根據實際需求決擇,要效率,還是要節省空間,或者折中。一般情況二者不可得兼, 要麼用空間換時間,要麼用時間換空間 。
四、演算法的好壞評定標準
時間複雜度 :T(n)
根據演算法寫成的程式在執行時 耗費時間的長度。這個長度往往也與輸入資料的規 模有關。時間複雜度過高的低效演算法可能導致我們 在有生之年都等不到執行結果。
空間複雜度 :S(n)
根據演算法寫成的程式在執行時 佔用儲存單元的長度。這個長度往往與輸入資料的 規模有關。空間複雜度過高的演算法可能導致使用的 記憶體超限,造成程式非正常中斷。
耗費空間的的演算法例項:
使用遞迴呼叫列印N個連續的數字:由於遞迴會不斷儲存上一個函式的狀態與地址等資訊,會不斷地申請空間,可能會將空間佔滿

耗費時間的演算法例項:
在求多項式的演算法設計中,直接的按照公式的設計的演算法由於引入了大量的冪次運算,增加了計算機的運算量(計算機更加願意做加減法運算),改進演算法利用提取公因式的方式(秦九韶公式),大大減少了乘法運算

五、分析演算法好壞:主要關心最壞情況複雜度,其次關心平均複雜度
最好情況、最壞情況 和 平均情況
- 某個特定的資料集能讓演算法的執行情況極好,這就是最「最好情況」
- 而另一個不同的資料會讓演算法的執行情況變得極差,這就是「最壞情況」
- 不過在大多數情況下,演算法的執行情況都介於這兩種極端情況之間,也就是「平均情況」
因此要理解好不同情況之間的差別,不要被極端情況迷惑。
- 「最優情況」:沒有什麼大的價值,因為它沒有提供什麼有用資訊,反應的只是最樂觀最理想的情況,沒有參考價值。
- 「平均情況」:是對演算法的一個全面評價,因為它完整全面的反映了這個演算法的性質,但從另一方面來說,這種衡量並沒有什麼保證,並不是每個運算都能在這種情況內完成。
- 「最壞情況」:它提供了一種保證,這個保證執行時間將不會再壞了, 所以一般我們所算的時間複雜度是最壞情況下的時間複雜度 ,做事要考慮到最壞的情況是一個道理。
常見數量級函式


注:
平常設計演算法過程中,養成分析演算法複雜度的習慣,看看是否能夠優化,比如設計了一個n^2 的演算法,應立刻想到能否優化到 nlogn 的數量級。
如何分析演算法的複雜度:
推薦文章—— ofollow,noindex">循序漸進帶你學習時間複雜度和空間複雜度