近日Emanuele Viola在Stackexchange上提了這樣的一個問題,他但願有人可以列舉一些目前軟件、硬件中正在使用的算法的實際案例來證實算法的重要性,對於你們可能給到的回答,他還提出了幾點要求:php
Vijay D的回覆得到了最佳答案,他的具體回覆內容以下:html
這是一個簡單的B+樹實現,我寫它的目的是做爲練習,並以此瞭解B+樹的工做原理。結果該實現發揮了它的實用價值。java
…node
一個不常常在教科書中說起的技巧:最小值應該放在右側,而不是左側。一個節點內全部被使用的槽位應該在左側,沒有使用的節點應該爲NUL,大部分的操做只遍歷一次全部的槽位,在第一個NUL處終止。linux
這些選擇的素數是位稀疏的,也就是說對他們的操做可使用位移和加法來替換機器中很慢的乘法操做;git
Knuth、Morris和 Pratt [1]實現了一個線性時間複雜度字符串匹配算法。該算法徹底規避了對轉換函數DELTA的顯式計算。其匹配時間爲O(n)(其中n是文本長度),只使用一 個輔助函數PI[1…m](其中m是模式的長度),模式的預處理時間是O(m)。PI這個數組容許DELTA函數在須要時能迅速運行。大致上,對任意 狀態q=0,1,…,m和任意SIGMA中的字符」a」,PI[「q」]保存了獨立於」a」的信息,並用於計算DELTA(「q」, 「a」)。因爲PI這個數組只包含m個條目,而DELTA包含O(m|SIGMA|)個條目,咱們經過計算PI進而在預處理時間保存|SIGMA|的系 數,而非計算DELTA。github
[1] Cormen, Leiserson, Rivest, Stein Introdcution to Algorithms, 2nd Edition, MIT Press正則表達式
[2] See finite automation theory算法
Boyer-Moore字符串匹配算法:chrome
[1] A Fast String Searching Algorithm, R.S. Boyer and Moore. Communications of the Association for Computing Machinery, 20(10), 1977, pp. 762-772. http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf
[2] Handbook of Exact String Matching Algorithms, Thierry Lecroq, 2004 http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf
注意:因爲Boyer-Moore(BM)自右向左作匹配,有一種可能性是一個匹配分佈在不一樣的塊中,這種狀況下是不能找到任何匹配的。
若是你想確保這樣的事情不會發生,使用Knuth-Pratt-Morris(KMP)算法來替代。也就是說,根據你的設置選擇合適的字符串查找算法。
若是你使用文本搜索架構來過濾、網絡入侵檢測(NIDS)或者任何安全爲目的,那麼選擇KMP。若是你關乎性能,好比你在分類數據包,並應用服務質量(QoS)策略,而且你不介意可能須要在分佈在多個片斷中匹配,而後就選擇BM。
此樹會被分配策略參數化,這個策略負責在C的自由存儲空間和區域中分配列表,參見zone.h
同時,代碼中還包含了一些第三方的算法和數據結構,例如:
自2000年以來,在工業標準中的SAT(布爾知足性問題)求解器的運行時間每一年都在成倍減小。這一發展的一個很是重要的緣由是衝突驅動條款學習算 法(Conflict Driven Clause Learning)的使用,它結合了Davis Logemann和Loveland的約束編程和人工智能研究技術的原始論文中關於布爾約束傳播的算法。具體來講,工業建模中SAT被認爲是一個簡單的問 題(見討論)。對我來講,這是近代最偉大的成功故事之一,由於它結合了先進的算法、巧妙的設計思路、實驗反饋,並以一致的共同努力來解決這個問題。Malik和Zhang的CACM論文是一個很好的閱讀材料。許多大學都在教授這個算法,但一般是在邏輯或形式化方法的課程中。
Databricks大數據公司聯合創始人@hashjoin首先並在微博上傳播了這個內容:
不少學生和軟件工程師都會好奇本身過去學習的算法有什麼實際應用的價值。這個StackExchange的回答列出了各類經典算法在幾個開源項目中的應用。http://t.cn/8kAP4yG 做者羅列出了從最基礎的hash table到字符串匹配和加密算法等在Chromium和Linux內核的代碼。查看開源代碼是學習算法實現一個好途徑。
你們也紛紛發表了本身的見解:
所謂的算法實現就跟背書同樣,因此若是不是爲了學習語法,千萬不要看那些帶代碼的編程書,或者編程書裏面的代碼。以學習爲目的的話,東西就本身作,而後本身用,用出翔了,你就知道他爲何很差了。
說算法沒啥用的人基本上說明他只在簡單的堆砌業務功能代碼的井底中。
我一直以爲在講述每個技術前,最好先讓你們知道這個技術能幹什麼,曾經幹過什麼,未來或許能用在什麼地方。這會增長你們對技術的興趣、理解和靈活運用,會讓你們學的更好。這挺重要