歷史上的第一個算法,竟然至今還能用!
↑↑↑點擊上方藍字,回復資料,10個G的驚喜
算法一直是程序員們“難啃的骨頭”。但早在計算機被發(fā)明以前,人們對于算法就已經研究了很長的時間。
算法歷史上的每一個“第一次”,都為計算機的發(fā)展帶來了重大影響。那算法為什么是計算機程序的靈魂?其實可以從它的發(fā)展史中略窺一二。
異步君將帶領大家從算法的每個“第一次”開始,了解“好”算法的性質,還會送給大家一些算法的基礎學習方法!
1
算法的每一個“第一次”
算法概念的第一次被提出
自古老的公元前1世紀開始,《周髀算經》就作為中國最古老的天文學和數學著作,在算法的歷史上寫下了濃墨重彩的一筆。
作為算經的十書之一,《周髀算經》采用最簡便可行的方法確定天文歷法,揭示日月星辰的運行規(guī)律,囊括四季更替,氣候變化,包涵南北有極,晝夜相推的道理。為后來者的生活作息提供了有力保障。
經過幾個世紀的發(fā)展,到公元9世紀,波斯數學家al-Khwarizmi第一次在數學上提出了“算法”這個概念——演算法(algorithm)。他提出的算法概念,仍舊沿用至今:
1.算術運算
指按照規(guī)定的法則和順序對式題或算式進行運算,并求出結果的過程。包括:加法、減法、乘法、除法、乘方、開方等幾種運算形式。
運算和計算略有區(qū)別,計算是指把橫式中的數按運算符號和規(guī)定的順序求得結果,可以按運算法則,也可以按口算或其他簡便的方式直接求得結果。而運算則是指求得結果的過程。
2.關系運算
關系的基本運算有兩類:一類是傳統(tǒng)的集合運算(并、差、交等),另一類是專門的關系運算(選擇、投影、連接、除法、外連接等),有些查詢需要幾個基本運算的組合,要經過若干步驟才能完成。
3.邏輯運算
邏輯運算又稱布爾運算。布爾用數學方法研究邏輯問題,成功地建立了邏輯演算。他用等式表示判斷,把推理看作等式的變換。這種變換的有效性不依賴人們對符號的解釋,只依賴于符號的組合規(guī)律 。這一邏輯理論人們常稱它為布爾代數。
歷史上第一個算法
公元前330年,被人們稱為“幾何之父”的歐幾里得出生了。在歐幾里得生活的那個時期,幾何學存在一個很大的缺點和不足,就是缺乏系統(tǒng)性。
這一時期的古希臘幾何學,大多數是片斷、零碎的知識,公理與公理之間、證明與證明之間并沒有什么很強的聯(lián)系性,更不要說對公式和定理進行嚴格的邏輯論證和說明。
于是歐幾里得下定決心,要在有生之年完成對幾何學的系統(tǒng)化理論化。由此,經過無數個日夜的撰寫,人類史上第一個算法——歐幾里得算法誕生了!
對現在的計算機行業(yè)來說,歐幾里得算法是目前最經典的幾大算法之一。
歷史上的第一個算法程序
19世紀80年代,“軟件之母”Ada Byron為巴貝奇分析機編寫了求解伯努利方程的程序。這是人類史上的第一個算法程序。?

巴貝奇分析機
Ada關于算法的研究實現了計算機科學的本質性飛躍。在她去世一百年之后的1953年,她之前所翻譯《分析機概論》留下的筆記被重新公布,再一次震驚了世人。人們因此認為,Ada對現代計算機與軟件工程造成了重大影響。
從現在的觀點來看,Ada首先為了計算制作了“算法”,然后制作了“程序設計流程圖”,這個珍貴的計劃被認為是“第一件計算機程序”。

“軟件之母”Ada Byron
作為世界上的第一位程序員,Ada為編程的發(fā)展做出了極大的貢獻。
第一次解決算法定義的難題
進入20世紀,算法得到了進一步的巨大發(fā)展。這個世紀,英國數學家圖靈提出了著名的圖靈論題,并提出一種假想的計算機的抽象模型,這個模型被稱為圖靈機。

圖靈機的構造
所謂的圖靈機就是指一個抽象的機器,它有一條無限長的紙帶,紙帶分成了一個一個的小方格,每個方格有不同的顏色,有一個機器頭在紙帶上移來移去。
機器頭有一組內部狀態(tài),還有一些固定的程序。每個時刻,機器頭都要從紙帶上讀入一個方格信息,然后結合內部狀態(tài)查找程序表,再根據程序輸出信息到紙帶方格上,并轉換自己的內部狀態(tài)進行移動。
雖然圖靈機十分地簡單,但它可以用來模擬任何算法。圖靈機對人們使用紙筆進行數學計算的過程進行了抽象,實現了用機器代替人類進行數學計算。圖靈機的出現,解決了算法定義的難題。
算法是計算機程序的靈魂,掌握了算法,就可以離開發(fā)出優(yōu)秀的程序更近一步。
2
“算法+數據結構=程序”
說到算法與編程的關系,異步君就必須向大家介紹一位傳奇人物:Nicklaus Wirth。
作為編程界的“Pascal之父”,Nicklaus Wirth有一句在計算機領域人盡皆知的名言:“算法+數據結構=程序”。
憑借著這句名言,Nicklaus Wirth在1984年拿到了圖靈獎的獎項。因為這個公式對計算機科學的影響程度,足以類似物理學中愛因斯坦的“E=MC^2”——僅用一個公式就展示了程序的本質。

Nicklaus Wirth
Nicklaus Wirth于1934年在瑞士北部的溫特圖爾出生,其父瓦爾特是一位地理學教授。Wirth小時候就喜歡動手動腦,他的最大愛好就是組裝飛機模型。
1960年,在加拿大萊維大學深造的Wirth獲得了碩士學位。取得碩士學位的他并不滿足,隨后便進入加州大學伯克利分校,于1963年獲得博士學位。
在斯坦福大學成功的開發(fā)出Algol W以及PL360后,愛國心極強的Nicklaus Wirth于1967年回到祖國瑞士,第二年在他的母校蘇黎世工學院,他創(chuàng)建與實現了Pascal語言——當時世界上最受歡迎的語言之一。
Pascal語言算得上是一種經典的算法語言。而算法的主要目的在于為人們提供閱讀了解所執(zhí)行的工作流程與步驟。那么,什么樣的算法才算是“好”的算法?異步君在這里提煉了幾個性質:
(1)正確性:正確性是指算法能夠滿足具體問題的需求,程序運行正常,無語法錯誤,能夠通過典型的軟件測試,達到預期的需求。
(2)易讀性:算法遵循標識符命名規(guī)則,簡潔易懂,注釋語句恰當適量,方便自己和他人閱讀,便于后期調試和修改。
(3)健壯性:算法對非法數據及操作有較好的反應和處理。例如,在學生信息管理系統(tǒng)中登記學生年齡時,若將21歲誤輸入為210歲,系統(tǒng)應該提示出錯。
(4)高效性:高效性是指算法運行效率高,即算法運行所消耗的時間短。算法時間復雜度就是算法運行需要的時間。
好的算法,可以讓我們開發(fā)程序達到事半功倍的效果。那么我們應該如何學好算法呢?
3
如何學好算法
隨著科技的發(fā)展,算法已經逐漸滲透在各行業(yè)內,是一個有著優(yōu)秀前景的專業(yè)領域。
怎樣學好算法?異步君在這里為大家準備了一些學習算法的入門路徑:
算法工程師必備技能
1.至少懂一門語言:C/C++/java/python/R;
2. 熟練運用各種常用算法和數據結構,有獨立的實現能力;
3.熟悉數據挖掘算法;
4.熟悉機器學習相關知識理論。
加分項:具有較為豐富的項目實踐經驗。
大家看到這里,肯定帶一個疑惑:是應該直接學習算法嗎?
萬丈高樓平地起,任何高深的算法都要從基礎算法學起,不可能一口吃個胖子。
所以,初入門的你學習算法還是要從基礎開始:
算法的基礎學習步驟
1.首先學習一門語言
例如 C/C++/Java/python,初學者學 C++比較普遍。
2.學數據結構
數據結構書有很多,但是有些教材晦澀難懂,建議看圖解多,通俗易懂的書,推薦《趣學數據結構》。
3.學算法
不要直接看《算法導論》,大量證明會讓你崩潰。
推薦《趣學算法》,有問題分析,完美圖解,偽碼詳解,實戰(zhàn)演練,適合初學者快速掌握經典算法。
程序的靈魂是算法。軟件開發(fā)中,選擇算法可以更快更好地實現功能。因此,程序員唯有掌握算法,才能輕松地駕馭程序開發(fā)。
也可以加一下老胡的微信 圍觀朋友圈~~~
推薦閱讀
(點擊標題可跳轉閱讀)
老鐵,三連支持一下,好嗎?↓↓↓
