何謂演算法
何謂演算法
之前反覆說過,要處理的資料越大,演算法和資料結構的選擇對速度的影響也就越大。首先看個簡單的例子。假設要從資料中使用線性查詢(Linear Search),從頭開始依次查詢所需資料,那麼如果有1000條資料,那就需要反覆查詢資料直至找到為止,這個演算法最多要進行1000次查詢。對於n條資料要進行n次搜尋,因此稱為O(n)演算法。
而“二分查詢”(binary search)演算法能在log n次之內查詢n條資料,是O(log n)演算法。使用二分查詢,1000條資料最多隻需10次就能查詢完。
這個“最大查詢次數”可以大致判斷計算次數,稱為複雜度。一般來說,複雜度越低,演算法就越快。
n=1000時,O(n)的最大查詢次數為1000,而O(log n)為10,計算次數差距為990。n再大些會怎樣呢?若是100萬條資料,O(n)需要100萬次,而O(log n)只需20次。即使是1000萬條,O(log n)也只需24次。很明顯,與O(n)相比,O(log n)更能承受資料量的增加。
請以大規模資料為前提思考一下。資料量較小時,即使使用O(n)這種簡單演算法,計算量也不會太大,因此沒什麼太大問題。但隨著資料量的增加,演算法選擇的差異就越來越大。在資料搜尋處理中,使用線性查詢的話,資料量增大到1000條、100萬條、1000萬條時……顯然會成為瓶頸。而解決該瓶頸的方法就是選擇複雜度更低的查詢演算法,這也是不言而喻的。
講述Hatena的服務之前,首先了解一下演算法的基本思路吧。
“演算法”是什麼?重新來考慮一下。根據《アルゴリズムイントロダクション 改訂2版 第1巻 數學的基礎とデータ構造》[1](近代科學社、2007年),演算法(algorithm)就是明確定義的(well-defined)、以某個值或值的集合為輸入(input)、以某個值或值的集合為輸出(output)的計算步驟。
——引用自《アルゴリズムイントロダクション 改訂2版 第1巻 數學的基礎とデータ構造》(Thomas H.Cormen/Charles E.Leiserson/Ronald L. Rivest/Clifford Stein著、淺野哲夫/巖野和生/梅尾博司/山下雅史/和田幸一譯,近代科學社,2007年)第5頁
輸入適當的值,透過明確定義的計算步驟得到輸出值,這就是演算法。將要查詢的資料和被查詢的資料作為輸入進行查詢,得到要查詢的資料所在的位置,這就是“查詢演算法”。
狹義演算法和廣義演算法
演算法這個詞具有狹義和廣義兩種含義,用途很廣泛。
從資料庫提取記錄進行適當處理後輸出成報表,對於這種平時隨手就能寫出的程式,也可以說“用的是什麼演算法?”這時提問者想知道的應該是處理(domain logic)的流程。這就是演算法的廣義含義。
而演算法的狹義含義,大多是指“針對明確定義的計算問題,執行已定義的計算步驟”。因此,市面上的演算法書並不是講述業務應用程式的處理邏輯,而是講述排序、搜尋、雜湊等計算問題的解法的。
第7章的內容就是狹義的演算法。
學習演算法的意義
——計算機資源有限,工程師的通用語言
CPU、記憶體等計算機資源是有限的,因此學習演算法十分重要。對於必須解決的問題,如何利用有限的資源解決掉,這種思考方式也是必須學習的。
而且,與設計模式同樣,演算法也是工程師們的通用語言。要用“使用雜湊就能解決了”這種語言來溝通,雙方都需要正確理解雜湊演算法是什麼。
學習演算法顯而易見的好處就是,理解演算法後就(可能)可以解決新的問題。
例如學習貝葉斯過濾器(Bayesian Filter)之後,就可以編寫資料自動分類之類的程式。利用該演算法可以編寫垃圾郵件過濾器。
有了能用幾MB的容量儲存幾億條資料的資料結構,就能輕松釋出由於過大而很難釋出的程式。如前一陣子釋出的Google日文輸入法[2]就用LOUDS這種資料結構將字典資料壓縮到50MB左右,這樣就能釋出巨大的字典。
而且如前所述,面對大規模資料時,演算法特性會對應用程式的效能產生巨大影響。學習演算法對於把握這種感覺也很有幫助。
為什麼演算法知識是必要的?
計算機資源有限
工程師們的通用語言
理解演算法後(也許)可以解決新問題
本文節選自《大規模WEB服務開發技術》一書
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-705176
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-705178/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 何謂開發框架?薦框架
- 何謂 Linux 使用者?Linux
- 何謂開源程式設計?程式設計
- 何謂“好的程式碼”? (轉)
- 何謂機器學習 機器學習能做些什麼?機器學習
- 何謂“第五代儲存”?
- 何謂深度定製作業系統?作業系統
- 討論:何謂擴充套件用例?套件
- 軟體行業大牛告訴你何謂成功?行業
- 何入CTF的“門”?——所謂入門就是入門
- 演算法之道:形而之上謂之道演算法
- 對於創業公司,何謂好的資料指標?創業指標
- Unity3D熱更新全書-何謂熱更新,為何熱更新,如何熱更新Unity3D
- 從支付、投資、融資三個維度理解何謂“網際網路金融”
- 所謂BAPIAPI
- 何謂元宇宙?元宇宙遊戲應用開發的內因和推薦元宇宙遊戲
- 所謂併發程式設計,所謂有其三程式設計
- C++謂詞C++
- 演算法、硬體、框架,2019年AI何去何從?演算法框架AI
- 聊聊所謂的cookieCookie
- php->所謂"hook"PHPHook
- Java 8謂詞鏈Java
- 所謂軟體工程軟體工程
- 所謂的演算法,有時候幾十行程式碼就能搞定!演算法行程
- C++計算幾何演算法大全C++演算法
- java8-謂詞(predicate)Java
- 所謂的職場祕籍
- 小解謂詞 access 與 filterFilter
- 重走機器學習之路——形而上者謂之道機器學習
- 原子謂詞公式和合式公式公式
- paper 100:何愷明經典去霧演算法演算法
- 所謂Serverless,你理解對了嗎?Server
- 所謂網際網路產品
- Partition 表掃描的過程,使用key作為謂詞與使用非key值做謂詞....
- 聊聊所謂的彈性工作制
- 傳說中的“謂詞越界“場景
- 所謂DNS汙染和劫持是什麼?DNS
- SQL 改寫系列七:謂詞移動SQL