一. ⛳️算法的定義     算法:是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。簡單説,算法就是 “解決問題的清晰流程”—— 就像菜譜(做菜的步驟)、導航路線(從 A 到 B 的路徑),本質都是算法。

二. ⛳️算法的特性     算法具有五個基本特性:輸入、輸出、有窮性、確定性和可行性。

2.1 🔔輸入     算法具有0個或多個輸入,儘管對於大多數算法來説,輸入參數都是有必要的,但對於個別情況,如打印"hello world!"這樣的代碼,不需要任何輸入參數,因此算法的輸入可以是零個。

2.2 🔔輸出     算法至少有1個或多個輸出,算法是一定需要輸出的,如果不需要輸出,我們還使用這個算法幹嘛呢?輸出的形式可以打印輸出,也可以是返回一個或多個值等。

2.3 🔔有窮性     有窮性:是指算法在執行有限的步驟之後,自動結束而不會出現無限循環,並且每一個步驟都在可接受的時間內完成。死循環代碼就是典型的不滿足有窮性的情況。

2.4 🔔確定性     確定性:算法的每一步驟都具有確定的含義,不會出現二義性。算法在一定條件下,只有一條執行的路徑,相同的輸入只能有唯一的輸出結果。算法的每一步驟都被精確定義而無歧義。

2.5 🔔可行性     可行性:算法的每一步都必須是可行的,也就是説,每一步都能夠通過執行有限次數完成。

三. ⛳️算法設計要求     算法不是唯一的。也就是説,解決同一個問題,可以有多種解決問題的算法。通常為了設計一個 “好” 的算法應考慮達到以下目標:

3.1 🔔正確性     正確性:算法的正確性是指算法至少應該具有輸入、輸出和加工處理無歧義性,能夠得到問題的正確答案。但是算法的 “ 正確 ” 一詞在用法上通常有很大差別,大體分為以下四個層次:

算法程序沒有語法錯誤; 算法程序對於合法的輸入數據能夠產生滿足要求的輸出結果; 算法程序對於非法的輸入數據能夠得出滿足規格説明的結果; 算法程序對於精心選擇的,甚至刁難的測試數據都有滿足要求的輸出結果。 對於這四層含義,層次 1的要求最低,但僅僅沒有語法錯誤實在談不上是好算法。這就是如同僅僅解決温飽,不算是生活幸福一樣。而層次 4是最難實現的,我們幾乎不可能逐一驗證所有的輸入都得到正確的結果。所以一般情況下,我們通常把層次 3作為衡量一個算法算法是否合格的標準。

3.2 🔔可讀性     可讀性:算法的另一個目的是為了便於閲讀,來理解和交流。可讀性高有助於人們理解算法,晦澀難懂的算法往往隱含錯誤,不易被發現,並且難以調試和修改。

3.3 🔔健壯性     健壯性:當輸入數據不合法時,算法也能做出相關處理而不是產生異常或莫名其妙的結果。

3.4 🔔時間效率高和存儲量低     時間效率指的是算法的執行時間。對於同一個問題,如果有多個算法能夠解決,執行時間短的算法效率高,執行時間長的效率低。存儲量需求指的是算法在執行過程中需要的最大空間,主要指算法程序運行時所佔用的內存或外部硬盤存儲空間。因此,設計算法時應儘量滿足時間效率高和存儲量低的需求。

四. ⛳️算法效率的度量方法     剛才我們提到了設計算法要提高效率。這裏的效率大都指算法的執行時間。算法的執行時間需要依據該算法編制的程序在計算機上運行時所消耗的時間來度量的。而度量一個程序的執行時間通常有有兩種方法 —— 事後統計方法和事前分析估算方法。

4.1 🔔事後統計方法     事後統計方法:這種方法主要是通過設計好的測試程序和數據,利用計算機計時器對不同的算法編制的程序的運行時間進行比較,從而確定算法效率的高低。但是這種方法明顯是有很大的缺陷:

必須要依據算法事先編制好程序,這通常要需要花費大量時間和精力。如果編制出來發現它根本就是一團很糟糕的算法,那不就是竹籃打水一場空了嗎? 時間的比較依賴計算機硬件和軟件等環境因素的影響,有時會掩蓋算法本身的優劣。 算法的測試數據設計困難,並且程序的運行時間往往還與測試數據的規模有很大關係,效率高的算法在小的測試數據面前往往得不到體現。 基於事後統計方法有這樣那樣的缺陷,我們一般不予以採納,而是採用另一種事前分析估算方法。

4.2 🔔事前分析估算方法     事前分析估算方法:在計算機程序編制前,依據統計方法對算法進行估算。經過分析我們可以發現,一個用高級程序語言編寫的程序在計算機上運行時所消耗的時間取決於一下因素:

解析:     第(1)條是一個好算法的根本,第(2)條要有軟件來支持,第(4)條要看硬件性能。因此,拋開這些與計算機硬件、軟件有關的因素,一個程序的運行時間,依賴於算法的好壞和問題的輸入規模。所謂問題輸入規模是指輸入量的多少。

五. ⛳️算法的複雜度 5.1 🔔算法的複雜度的簡單介紹     算法在編寫成可執行程序後,運行時需要耗費時間資源和空間(內存)資源 。因此衡量一個算法的好壞,一般是從時間和空間兩個維度來衡量的,即時間複雜度和空間複雜度。

時間複雜度主要衡量一個算法的運行快慢,而空間複雜度主要衡量一個算法運行所需要的額外空間。在計算機發展的早期,計算機的存儲容量很小。所以對空間複雜度很是在乎。但是經過計算機行業的迅速發展,計算機的存儲容量已經達到了很高的程度。所以我們如今已經不需要再特別關注一個算法的空間複雜度。

5.2 🔔算法複雜度的重要性 複雜度在校招中的考察已經很常見,如下:

📝全文總結 本文主要講解:

算法的定義:算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。 算法的特性:有窮性、確定性、可行性、輸入、輸出。 算法的設計要求:正確性、可讀性、健壯性、高效率和低存儲量需求。 算法的度量方法:事後統計方法、事前分析估算方法。

———————————————— 版權聲明:本文為CSDN博主「聆風吟_」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/2301_80026901/article/details/155097120