作者 | Alekya Ragipally
譯者 | 彎月,責編 | 屠敏
頭圖 | CSDN 下載自東方 IC
出品 | CSDN(ID:CSDNnews)
以下為譯文:
當你使用搜尋引擎(例如Google Chrome、Mozilla Firefox等)的時候,後臺發生了什麼?當你詢問虛擬助手(例如Alexa、Google助手或Siri)的時候,後臺發生了什麼?它們怎麼會知道答案?為何它們會顯示正確答案?所有這些都要感謝算法。
每當你使用手機、計算機、筆記本電腦或計算器時,其實都在使用算法。
那麼,什麼是算法?
如果你想做數學運算,比如說兩個數字相乘(不使用任何電子設備),那麼你需要在紙上做乘法。你按照一定的規則獲得正確的答案。你也可以使用耗時更少的方法來做計算。這就是算法。
算法是為執行特定的任務而設計的一組指令。
有些算法很簡單,而有些則非常複雜,具體取決於你要實現的目標。
算法的歷史
了解歷史總是有好處,因為歷史可以幫助你更好地理解主題,並了解何時使用這些知識。
「算法」一詞源自九世紀波斯數學家Muhammad Ibn Musa Al-Khwarizmi(代數之父),拉丁語為Algoritmi。最初算法被稱為Algorismus。15世紀後期,改名為Algorithmus(源自希臘語Arithmetic)。現代英語中的Algorithm一詞是於19世紀引入的。
算法在中國古代文獻中稱為「術」,最早出現在《周髀算經》、《九章算術》。特別是《九章算術》,給出四則運算、最大公約數、最小公倍數、開平方根、開立方根、求素數的埃拉託斯特尼篩法,線性方程組求解的算法。三國時代的劉徽給出求圓周率的算法:劉徽割圓術。
1842年,Ada Lovelace首次編寫了計算引擎的算法,因此許多人常常稱她為世界上第一位電腦程式員。她為巴貝奇分析機(自動計算的機械計算機)編寫了求解伯努利微分方程的算法(巴貝奇分析機由計算機之父Charles Babbage開發)。
1936年,Alan Turing的圖靈機首次提出了第一個以現代形式表示的算法。
如何表達算法?
表達算法的方法多種多樣,例如自然語言、偽代碼、流程圖、程式語言、動態圖表、控制表等等。
使用自然語言表達算法不夠清晰,因此很少用於複雜或技術算法。偽代碼、流程圖、drakon圖和控制表是表達算法的結構化方法,因為與自然語言相比,它們可以避免許多歧義。程式語言旨在以可由計算機執行的形式表達算法。
在計算機系統中,算法是由軟體開發人員以他們選擇的任何程式語言編寫的邏輯。但是,在設計算法時,我們需要記住一些規則。其中包括:
輸入:算法至少需要一個或多個輸入值。如果沒有給出輸入,那麼算法將產生什麼輸出呢?
輸出:算法至少應產生一個輸出。如果沒有產生任何結果,則無需設計算法。
效率:算法應該保證高效利用計算和內存資源。產生的輸出應該又正確又快。
簡單性:算法不應過於複雜。
可擴展性:算法必須能夠在不更改核心邏輯的情況下進行擴展。
有限性:算法必須在有限步驟後終止。假設輸入錯誤的情況下,算法在第一步就終止,我們將永遠無法得知算法有什麼問題。而且,算法也不能陷入無限循環。
不依賴於程式語言:算法必須與語言無關,也就是說,它必須是可以用任何一種語言都可以實現的簡單指令,但是無論任何語言,輸出都應當相同。
下面,我們來構建一個簡單的算法:兩個數字的加法(且滿足上述要求)。
第1步:開始;
第2步:聲明變量num1,num2和sum;
第3步:讀取值num1和num2;
第4步:將num1和num2相加,然後將值賦給sum。
第5步:顯示和;
第6步:停止。
下面,為了測試這個算法,我們使用一種程式語言來實現它,我選擇用Java語言來實現,你可以任意選擇其他語言。
public class Addition
{
public static void main(String[] args) {
int num1, num2, sum;
Scanner sc = new Scanner(System.in);
System.out.println(「Enter First Number: 「);
num1 = sc.nextInt();
System.out.println(「Enter Second Number: 「);
num2 = sc.nextInt();
sc.close();
sum = num1 + num2;
System.out.println(「Sum of two numbers: 「+sum);
}
}
輸出如下:
我們的算法運作良好,且滿足上述要求。
算法必須高效。算法的效率取決於時間和空間。一個好的算法佔用的時間更少,佔用的空間也更少,我們無法時刻兼顧兩者。如果減少時間,則則空間可能會增加,反之亦然。因此,我們必須妥協一方。算法的空間複雜度表示算法運行時佔用或需要的總空間。時間複雜度是指算法花完成任務所需的操作數。以最少操作數執行任務的算法就是最有效的算法。此外,算法花費的時間還取決於計算機的計算速度,但是在我們考慮算法的效率率時,通常不會考慮這些外部因素。衡量算法效率的一種方法是測量算法在不同輸入下找到答案所需的操作次數。
算法的種類
遞歸算法:通過重複將問題分解為同類的子問題而解決問題。
分治算法:把一個複雜的問題分成兩個或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。
動態規划算法(又名動態優化算法):記住過去的結果,以備將來使用。與分治算法相似,這種算法可以將複雜的問題分解相對簡單的子問題,然後將解決方案保存起來,以便下次需要同一個子問題解之時直接使用,而無需再次重新計算。
貪婪算法:在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望得出結果是最好或最優的算法。該算法不能保證最終獲得最佳解決方案。
暴力算法:簡單明了,嘗試所有的可能性,直到找到滿意的解決方案為止。
回溯算法:嘗試分步地去解決一個問題。如果發現其中某一步的解決方案失敗,則後退一步或幾步,重新開始尋找解決方案。
如今,幾乎每個領域都使用算法,例如數據科學、機器學習、農業、科學、運輸等。算法是每個應用程式(Google Chrome與Mozilla Firefox、Uber與Ola)最大的不同之處,例如Google Chrome和Mozilla Firefox都是搜尋引擎應用程式,它們提供相同的結果,但是結果的順序有所不同,這是因為二者使用了不同的排序算法。Google的排序算法與Firefox不同。
算法無處不在,並將繼續傳播,算法讓我們的生活更加輕鬆,但我們還需要考慮一些問題,例如,
當有一天數據和預測模型統治世界,那麼我們就會喪失人性和判斷力。
隨著更智能、更高效的算法逐步取代許多的人類活動,失業人數將上升。
21世紀,算法就像魔術一樣,我們可以解釋其背後的原理以及如何創建網絡等,卻無法機械地解釋為什麼這些算法會產生特定的輸出。而這僅僅是個開始。
原文:https://medium.com/@alekya3/what-is-an-algorithm-everything-you-need-to-know-about-algorithms-79bb99cb0c11
本文為 CSDN 翻譯,轉載請註明來源出處。
更多精彩推薦
蘋果或在 WWDC 宣布放棄英特爾轉向自研 5nm ARM 晶片,這次時機成熟了?
國產資料庫技術全面破冰,金融核心系統打破國外巨頭壟斷指日可待
Linux 之父怒刪工程師提交的補丁,稱「太蠢了」網友:懟得好!
乾貨!3 個重要因素,帶你看透 AI 技術架構方案的可行性!
乾貨 | 大白話徹底搞懂 HBase RowKey 詳細設計
熱評 | 警惕新基建熱潮中的區塊鏈項目爛尾
你點的每個「在看」,我都認真當成了喜歡