算法是什麼:計算機領域中算法的科普

2020-12-08 TechWeb

 

當你使用搜尋引擎(例如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世紀,算法就像魔術一樣,我們可以解釋其背後的原理以及如何創建網絡等,卻無法機械地解釋為什麼這些算法會產生特定的輸出。而這僅僅是個開始。

 

相關焦點

  • 人工智慧:AI的算法跟普通計算機的算法到底有什麼不同?
    AI智能計算機在本文中,我們大概了解AI算法以及常規算法和AI算法之間的區別。AI算法:人工智慧是一組算法,可使計算機從以前的結果中學習並獲得信息的更新,而無需人工幹預。簡單地向其饋送大量結構化數據以完成任務,而無需編程如何執行此任務。
  • 經典算法的反超:比量子計算機更快的模擬分叉算法
    東芝宣布,一個受量子計算啟發的新算法可能會比超級計算機上運行的其他類似的組合優化算法更快,但僅僅需要一部臺式機就可以運行。圖片來源:Hayato Goto這個算法名為「模擬分叉算法(Simulated Bifurcation Algorithm)」,是由東芝的一位資深研究科學家Hayato Goto發明的。
  • 什麼是算法? - 《我的第一本算法書》
    食譜上經常會有描述得比較模糊的部分,而算法的步驟都是用數學方式來描述的,所以十分明確。算法和程序有些相似,區別在於程序是以計算機能夠理解的程式語言編寫而成的,可以在計算機上運行,而算法是以人類能夠理解的方式描述的,用於編寫程序之前。不過,在這個過程中到哪裡為止是算法、從哪裡開始是程序,並沒有明確的界限。
  • 量子計算機原理與退火算法的通俗解釋
    但隨著科學的發展,量子理論的巨大潛能越來越多的被發掘出來,並被應用到了多種領域。本文的目的是盡力用基礎易懂的語言來解釋自己所理解的量子物理的基礎理論並著重介紹量子計算機的實現原理、量子計算機所使用的量子退火算法以及量子計算機的應用。
  • 上海交大計算機系鬱昱教授參與設計的密碼算法獲全國密碼算法設計...
    2020年1月13日,全國密碼算法設計競賽舉行頒獎儀式,上海交通大學計算機系鬱昱教授與密碼技術國家重點實驗室和中科院軟體所等單位的科研人員共同設計的Aigis-enc後量子公鑰加密算法和Aigis-sig後量子數字籤名算法獲得了本次競賽公鑰算法組的兩項一等獎(公鑰算法組共產生一等獎三項)。
  • 你知道計算機語言、編程、算法及軟體開發之間有什麼聯繫和區別嗎
    總結起來,有很多問題可以歸類於一種問題,那就是有很多初學者,或者剛剛進入到計算機編程領域、軟體開發新手對一些概念還是搞不清楚,不能夠正確理解計算機語言、計算機編程、計算機算法及軟體開發之間的聯繫和區別。我們可以說計算機語言、計算機編程、計算機算法及軟體開發都屬於軟體範疇,最終的目的是開發出一個(套、種)計算機軟體,達到某些功能從而滿足人們的一定需求。
  • 什麼是算法?快速學會使用python編寫算法
    01什麼是算法?我們來看百度百科對算法的解釋:算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令。我們可以理解算法就是計算機面對一個問題的解決方法。比如,我們要求計算機幫我們將輸入的100個整數從小到大進行排序,那麼排序的具體方法,就是算法。舉個例子,比如我們現在有這麼一列數據 [ 5,7,8,3,1],現在需要程序幫我們進行從小到大進行排序。應該怎麼辦呢?
  • 人腦模擬算法究竟是什麼?
    科學家剛剛發明了一種能夠進行完整的人腦模擬的算法。現在,我們必須等待某人建立一個足夠強大的計算機來運行它。由德國、日本、挪威和瑞典的研究人員組成的團隊最近發表了一篇白皮書,詳細介紹了一種新的算法,它將虛擬神經元與節點連接起來。
  • 計算機視覺中,有哪些比較好的目標跟蹤算法?(上)
    《計算機視覺中,目前有哪些經典的目標跟蹤算法?》我比較關注目標跟蹤中的相關濾波方向,接下來我幫您介紹下我所認識的目標跟蹤,尤其是相關濾波類方法,分享一些我認為比較好的算法,順便談談我的看法。第一部分:目標跟蹤速覽先跟幾個SOTA的tracker混個臉熟,大概了解一下目標跟蹤這個方向都有些什麼。一切要從2013年的那個資料庫說起。。
  • 中消協:加強網絡消費領域算法規制,保障消費者權益!
    中國政法大學、清華大學、對外經濟貿易大學、北京工商大學、北京網際網路法院等單位的法學專家,中國信息通信研究院、北京計算機學會等機構的技術專家,中消協律師團律師,北京、安徽、蕪湖等地方消協組織代表和消費者代表參與在線座談。最高人民法院研究室、中央網信辦秘書局、國家市場監管總局價監競爭局、國家市場監管總局網監司有關同志在線聽取意見,首都各大媒體在線列席會議。
  • 算法與算法工程師,技術與技術人員
    (註:標題裡的算法,指機器學習算法,或者說「算法工程師」這個職位名稱裡的「算法」,不是「算法與數據結構」裡的那個算法。誰能告訴我有沒有什麼更好的名字來區別這它們,或許是「機器學習算法」與「傳統算法」?)算法與算法工程師先來一段我在知乎裡回答「做算法工程師是一種怎樣的體驗?」
  • 算法是個什麼鬼?其實很簡單!
    在數學和計算機科學中,算法是解決一類問題的明確說明。算法可以執行計算、數據處理、自動推理和其他任務。然而,算法也可以通過其他方式實現,例如在生物神經網絡(例如,人腦實現算法或昆蟲尋找食物)、電路或機械裝置中。計算機算法在計算機系統中,算法基本上是軟體開發人員在軟體中編寫的邏輯實例,對於預期的「目標」計算機從給定的(可能為空)輸入產生輸出是有效的。
  • 考研計算機 | 數據結構—結構算法
    2021計算機考研數據結構—結構算法算法的設計取決於數據(邏輯)結構,而算法的實現依賴於採用的存儲結構
  • 聚類算法中的若干挑戰問題
    國防科技大學祝恩教授圍繞聚類算法,探討在實際應用中面臨的若干現實挑戰問題。作者:祝恩,國防科技大學計算機學院教授聚類是模式識別、機器學習、數據挖掘等領域中的基礎算法,在商業選址、金融產品推薦、異常檢測等方面有廣泛應用,但在實際應用中聚類可能遇到一些現實挑戰問題。物以類聚,人以群分。
  • 算法中的種族主義和性別歧視 | 人工智慧
    這通常被稱為算法偏差。很難確切知曉系統是如何易受算法偏差影響的,特別是因為這種技術往往在公司的黑匣子裡運行。我們常常並不清楚一個特定的人工智慧或算法是如何設計的,什麼數據幫助構建它,或者它是如何工作的。算法對個體的影響到底是什麼?這問題值得每個人深思一般來講,你只知道最終的結果:如果你在第一時間意識到了人工智慧和算法的使用,它對你有什麼影響。
  • 常用機器學習算法的目前主要有深度學習領域的各種模型及框架
    中國人工智慧四個代表職位之一的「算法工程師」——數據科學家,是近年來在網際網路和人工智慧領域顯示出極大發展潛力的新興職位,是在計算機科學、工程技術等諸多領域中分別涉及的領域內的一個綜合領域。很多初期從事人工智慧相關工作的人,受限於對本專業知識認識有限,在對人工智慧了解尚淺之時,就開始應聘。甚至有人剛開始著手做招聘工作時,就拿數據科學家這個工作的名稱誤導了初入門人工智慧行業的從業者。
  • AI算法進步神速對人工智慧意味著什麼
    AI算法進步神速對人工智慧意味著什麼 胡薇 發表於 2018-10-29 14:52:11 對於「未來的算法能與現有半導體晶片或正在開發之新運算架構契合」這件事,我們能抱持多大的信心?
  • 獵頭算法崗位
    拍照算法工程師   上海/深圳/北京 (40-80)W/Y崗位職責:1、行動裝置相機相關圖像處理算法研發2、對目前現有算法性能和效果優化崗位要求:1、計算機相關專業本科以上學歷,圖像處理,模式識別,計算機視覺相關方向。2、五年以上圖像算法相關工作經驗,具備紮實的數學功底。3、精通圖像處理、信號處理基礎知識。
  • 主宰全球的10大算法
    什麼是算法?簡而言之,任何定義明確的計算步驟都可稱為算法,接受一個或一組值為輸入,輸出一個或一組值。(來源:homas H. Cormen, Chales E. Leiserson 《算法導論第3版》)可以這樣理解,算法是用來解決特定問題的一系列步驟(不僅計算機需要算法,我們在日常生活中也在使用算法)。
  • 計算機專業應數據結構和算法至上?還是與業務掛鈎的技術至上?
    近日,一位網友在知乎上發起提問:計算機學生在大學四年應是以數據結構和算法為重還是技術為重?引來網友紛紛圍觀!讀計算機專業的你,大學四年是否還在迷茫是以數據結構和算法為重還是技術為重? 要想解除疑惑,先要知道計算機科學與技術這個專業都包含了什麼。