其實這是乙個不太好解釋的問題,因為並沒有乙個完備的定義。筆者在演算法領域遇到了不少同行,發現各自的工作側重點甚至思維方式都很不同。為了給入門的朋友乙個清晰的梳理,這裡就簡單串一串12個常見的演算法。
首先,全景圖鎮樓。
一般來說,可以把程式設計工作分為兩種,一種是面向實現的,一種是面向優化的。前者如實現乙個功能、搭建乙個服務、實現一種展現互動方式等。更關注的是如何實現功能,如何對於各種複雜甚至小眾的場景都不出錯。網際網路中典型的後端、前端、平台、網路工程師的主要工作是這一類。
如果一些功能已經實現了,你主要需要優化它,那這類工作一般比較偏向演算法。其中乙個關鍵是你的優化目標要是客觀可量化的。比如一些**優化的工作是提公升**的可維護性、可讀性和可擴充套件性。這個優化目標具備比較強的主觀性,難以形成量化的指標,屬於設計模式主要關注的問題,一般不納入演算法範疇。
另乙個區分演算法與非演算法工作的重要特徵是一般涉及數學知識較多的程式設計工作更偏向演算法。比如對於面向優化的程式設計工作,為了很好地衡量可量化的目標,其數學定義往往比較明確,相應引入的數學知識會比較多。
那麼如果面向實現的程式設計工作也依賴大量數學知識時是否算作演算法呢?其中乙個例子是可計算性理論,它涉及到可判定性問題、數理邏輯等問題都需要大量複雜的數學知識。這種情況下,它其實更關心何種問題原則上是否可用演算法解決,在實際工程領域中並沒有大量的崗位與之相匹配,所以本文暫不將其作為演算法工程師所考慮的範圍。
另乙個例子是加密演算法。加密演算法的目標是保證資料的安全通訊,保證其加密性、完整性和身份唯一確認。看起來是面向實現,但換乙個視角,加密演算法設計的指導思想是提高其解密成本,也可以算是面向優化的。
如果你的優化目標是要降低程式的時間複雜度與空間複雜度,它們都是能夠比較嚴格地量化定義的,就屬於經典的「資料結構與演算法」中關注的「演算法」的問題。leetcode中大部分algorithm的題目都屬於此類,也是網際網路面試中的高頻考點,如常見的分治、遞迴、動態規劃等。在實際工作中,特別是一些架構師相關的角色,會著重關注這類問題,比如提公升增刪改查的速度、降低其記憶體消耗等等。相應的數學理論是計算複雜性理論,依賴的數學知識包括離散數學、組合數學、圖論等。
如果你的優化目標是要降低在未見過的case上的**誤差,這是典型的機器學習中的演算法問題。這裡面涉及到一些核心的概念,包括:泛化誤差、訓練誤差、過擬合、欠擬合、偏差等。相應的演算法崗位非常多,影象演算法、語音演算法、自然語言處理演算法、搜尋推薦演算法等。
機器學習演算法還可以根據優化目的的不同進行進一步的細分。如果訓練資料帶有標籤,優化目標是降低**標籤的誤差則是最常見的有監督學習。如果訓練資料不帶標籤,則是無監督學習。而如果此時又非要**對應的標籤,則有降維和聚類兩種演算法。如果僅僅是為了擬合訓練資料的分布,生成式演算法。
它的數學理論是計算學習理論,依賴的數學知識包括概率與統計、最優化理論、線性代數與矩陣論等。
當然,最優化本身就是一種演算法。稍微嚴格一點的表述是在一定的約束條件下控制自變數達到目標函式最優的問題。最優化問題也叫作運籌學,在工程界應用非常廣泛。典型的如外賣騎手排程、網約車排程、航班排程、物流路徑排程、廣告/補貼金額投放等。
最優化演算法的種類也比較多,以自變數是否連續可分為連續最優化和組合優化。很多計算複雜度優化演算法可以看做一種廣義的組合優化問題。機器學習演算法一般是連續最優化問題。
生成對抗網路(gan)有點特殊,可以理解成兩種機器學習演算法的組合,一種演算法的優化目標是降低生成樣本與真實樣本的區分難度,另一種演算法的優化目標是提公升他們的區分難度。而這兩個目標是相互對立的,這又借鑑了博弈論的思路。這類演算法在影象風格遷移、影象修復等場景有非常多的應用。
另外,模型壓縮演算法可以理解成機器學演算法與優化計算複雜度演算法組合,在一定的誤差容忍範圍下顯著降低模型的空間複雜度和推斷時間複雜度。其典型應用場景是模型的實時運算加速、邊緣部署壓縮等。
這裡主要從面向優化的角度上串講了以下12種思維方式不同的演算法:加密演算法、計算複雜度優化演算法、最優化演算法、有監督學習、無監督學習(降維、聚類、生成)、強化學習、博弈論、多智慧型體強化學習、生成對抗網路、模型壓縮演算法等。
因為是科普向,很多細節沒展開,特別是機器學習演算法和優化計算複雜度演算法的各個流派沒有**。
我們將在接下來的文章中進行更加詳細的介紹。
SRE工程師到底是做什麼的?
儘管站點可靠性工程已經存在了一段時間,但也只是最近才在業界獲得一些名聲。但人們對於站點可靠性工程師 sre 的作用仍然存在很多疑問。我們所知道的大部分內容來自谷歌的 站點可靠性工程 一書。我們將在這篇文章中多次提到這本書。人們將sre與運營 系統管理員等進行比較,但這種比較不足以說明他們在現代軟體環...
SRE工程師到底是做什麼的?
儘管站點可靠性工程已經存在了一段時間,但也只是最近才在業界獲得一些名聲。但人們對於站點可靠性工程師 sre 的作用仍然存在很多疑問。我們所知道的大部分內容來自谷歌的 站點可靠性工程 一書。我們將在這篇文章中多次提到這本書。人們將sre與運營 系統管理員等進行比較,但這種比較不足以說明他們在現代軟體環...
SRE工程師到底是做什麼的?
儘管站點可靠性工程已經存在了一段時間,但也只是最近才在業界獲得一些名聲。但人們對於站點可靠性工程師 sre 的作用仍然存在很多疑問。我們所知道的大部分內容來自谷歌的 站點可靠性工程 一書。我們將在這篇文章中多次提到這本書。人們將sre與運營 系統管理員等進行比較,但這種比較不足以說明他們在現代軟體環...