何謂演算法

broadviewbj發表於2011-08-17

何謂演算法

之前反覆說過,要處理的資料越大,演算法和資料結構的選擇對速度的影響也就越大。首先看個簡單的例子。假設要從資料中使用線性查詢(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,計算次數差距為990n再大些會怎樣呢?若是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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章