不論今天的計算機技術變化,新技術的出現,全部都是來自數據結構與算法基礎。咱們須要溫故而知新。php
算法、架構、策略、機器學習之間的關係。在過往和技術人員交流時,不少人對算法和架構之間的關係感到不可理解,算法是軟的,架構是硬的,難道算法和架構還有什麼關係不成?其實否則,算法和架構的關係很是緊密。在互聯網時代,咱們須要用算法處理的數據規模愈來愈大,要求的處理時間愈來愈短,單一計算機的處理能力是不可能知足需求的。而架構技術的發展,帶來了不少不一樣特色的分佈式計算平臺。算法爲了可以應用到這些分佈式計算平臺上,每每須要進化,例如:並行計算要求算法能夠拆分爲可並行計算的幾個獨立單位,但不少算法不具有這種可拆分特性,使得不能簡單經過分佈式計算來提升效率。這時候,爲了實現分佈式化的計算效果,須要將算法進行等效改寫,使得其具備獨立拆分性。另外一方面,算法的發展,也反過來會對計算架構提出新的要求。html
對算法和策略的關係亦是,不過這兩個概念並不像算法和架構那樣好解釋。策略是解決具體問題的手段,而算法是解決一類問題的方法。解決一個具體問題,可能須要將問題分解爲一個或者多個算法,一塊兒做用來解決,也可能不須要算法。例如,對於個性化新聞,咱們可能有一個策略是:重大新聞須要及時展示給用戶;而實現的具體算法可能只包括「重大新聞挖掘算法」等。java
機器學習是一類算法的統稱,在必定的數據集合上,利用機器學習的算法,自動獲得規律,來進行預測,機器學習領域常見的問題包括分類問題、迴歸問題等。而預測,尤爲是對用戶的偏好進行預測是推薦領域的核心問題之一,機器學習算法在解決此類問題上會發生很大的做用。node
正文linux
1、數據結構基礎 git
數組 github
定義 正則表達式
知識要點 算法
時間複雜度 chrome
鏈表
定義
要點
時間複雜度
哈希表或哈希圖
定義
要點
時間複雜度
二叉樹
定義
要點
時間複雜度
2、搜索基礎
廣度優先搜索
定義
要點
時間複雜度
深度優先搜索
定義
要點
時間複雜度
廣度優先搜索 VS. 深度優先搜索
細微的區別
3、高效排序基礎
歸併排序
定義
要點
時間複雜度
快速排序
定義
要點
時間複雜度
冒泡排序
定義
要點
時間複雜度
歸併排序 VS. 快速排序
4、算法類型基礎
遞歸算法
定義
要點
迭代算法
定義
要點
遞歸 VS. 迭代
遍歷數組的僞代碼(這就是爲何使用迭代的緣由)
Recursion | Iteration
----------------------------------|----------------------------------
recursive method (array, n) | iterative method (array)
if array[n] is not nil | for n from 0 to size of array
print array[n] | print(array[n])
recursive method(array, n+1) |
else |
exit loop
貪婪算法
定義
要點
僞代碼:用貪婪算法找到數組中任意兩個數字間的最大差值
greedy algorithm (array)
var largest difference = 0
var new difference = find next difference (array[n], array[n+1])
largest difference = new difference if new difference is > largest difference
repeat above two steps until all differences have been found
return largest difference
這一算法無需比較全部數字兩兩之間的差值,省略了一次完整迭代。
Legend
Excellent |
Good |
Fair |
Bad |
Horrible |
Data Structure Operations
Data Structure |
Time Complexity |
|
|
|
|
|
|
|
Space Complexity |
|
Average |
|
|
|
Worst |
|
|
|
Worst |
|
Access |
Search |
Insertion |
Deletion |
Access |
Search |
Insertion |
Deletion |
|
O(1) |
O(n) |
O(n) |
O(n) |
O(1) |
O(n) |
O(n) |
O(n) |
O(n) |
|
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
|
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
|
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
O(n) |
O(1) |
O(1) |
O(n) |
|
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
O(n) |
O(n) |
O(n) |
O(n log(n)) |
|
- |
O(1) |
O(1) |
O(1) |
- |
O(n) |
O(n) |
O(n) |
O(n) |
|
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
O(n) |
O(n) |
O(n) |
O(n) |
|
- |
O(log(n)) |
O(log(n)) |
O(log(n)) |
- |
O(n) |
O(n) |
O(n) |
O(n) |
|
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
|
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
|
- |
O(log(n)) |
O(log(n)) |
O(log(n)) |
- |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
|
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(n) |
Array Sorting Algorithms
Algorithm |
Time Complexity |
|
|
Space Complexity |
|
Best |
Average |
Worst |
Worst |
O(n log(n)) |
O(n log(n)) |
O(n^2) |
O(log(n)) |
|
O(n log(n)) |
O(n log(n)) |
O(n log(n)) |
O(n) |
|
O(n) |
O(n log(n)) |
O(n log(n)) |
O(n) |
|
O(n log(n)) |
O(n log(n)) |
O(n log(n)) |
O(1) |
|
O(n) |
O(n^2) |
O(n^2) |
O(1) |
|
O(n) |
O(n^2) |
O(n^2) |
O(1) |
|
O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
|
O(n) |
O((nlog(n))^2) |
O((nlog(n))^2) |
O(1) |
|
O(n+k) |
O(n+k) |
O(n^2) |
O(n) |
|
O(nk) |
O(nk) |
O(nk) |
O(n+k) |
Graph Operations
Node / Edge Management |
Storage |
Add Vertex |
Add Edge |
Remove Vertex |
Remove Edge |
Query |
O(|V|+|E|) |
O(1) |
O(1) |
O(|V| + |E|) |
O(|E|) |
O(|V|) |
|
O(|V|+|E|) |
O(1) |
O(1) |
O(|E|) |
O(|E|) |
O(|E|) |
|
O(|V|^2) |
O(|V|^2) |
O(1) |
O(|V|^2) |
O(1) |
O(1) |
|
O(|V| ⋅ |E|) |
O(|V| ⋅ |E|) |
O(|V| ⋅ |E|) |
O(|V| ⋅ |E|) |
O(|V| ⋅ |E|) |
O(|E|) |
Heap Operations
Type |
Time Complexity |
|
|
|
|
|
|
|
Heapify |
Find Max |
Extract Max |
Increase Key |
Insert |
Delete |
Merge |
- |
O(1) |
O(1) |
O(n) |
O(n) |
O(1) |
O(m+n) |
|
- |
O(n) |
O(n) |
O(1) |
O(1) |
O(1) |
O(1) |
|
O(n) |
O(1) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(log(n)) |
O(m+n) |
|
- |
O(1) |
O(log(n)) |
O(log(n)) |
O(1) |
O(log(n)) |
O(log(n)) |
|
- |
O(1) |
O(log(n)) |
O(1) |
O(1) |
O(log(n)) |
O(1) |
Big-O Complexity Chart
B+ 樹,代碼中的註釋將會告訴你一些教科書中不能學到的內容:
這是一個簡單的B+樹實現,我寫它的目的是做爲練習,並以此瞭解B+樹的工做原理。結果該實現發揮了它的實用價值。
...
一個不常常在教科書中說起的技巧:最小值應該放在右側,而不是左側。一個節點內全部被使用的槽位應該在左側,沒有使用的節點應該爲NUL,大部分的操做只遍歷一次全部的槽位,在第一個NUL處終止。
radix樹的一個常見的用法是保存頁面結構體的指針;
包含指針的只容許簡單插入的靜態大小優先級堆,基於CLR(算法導論)第七章
哈希函數,引用Knuth和他的一篇論文:
Knuth建議選擇與機器字長所能表達的最大整數約成黃金比例的素數來作乘法散列,Chuck Lever 證明了這個技術的有效性;
http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
這些選擇的素數是位稀疏的,也就是說對他們的操做可使用位移和加法來替換機器中很慢的乘法操做;
有些代碼,好比這個驅動,他們是本身實現的哈希函數
在命名空間樹中執行一個修改過的深度優先算法,開始(和終止於)start_handle所肯定的節點。當與參數匹配的節點被發現之後,回調函數將會被調用。若是回調函數返回一個非空的值,搜索將會當即終止,這個值將會回傳給調用函數;
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。
[1] Cormen, Leiserson, Rivest, Stein Introdcution to Algorithms, 2nd Edition, MIT Press
[2] See finite automation theory
Boyer-Moore模式匹配,以下是引用和對其餘算法的使用建議;
Boyer-Moore字符串匹配算法:
[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
同時,代碼中還包含了一些第三方的算法和數據結構,例如:
爲GIF圖片格式而出現的Lempel-Zivsraf算法在圖片處理程序中常常被應用,從一個簡單的*nix組件轉化爲一個複雜的程序;
運行長度編碼被用於生成PCX文件(用於Paintbrush這個程序中),壓縮BMP文件和TIFF文件;
小波壓縮(Wavelet壓縮)是JPEG 2000的基礎,因此全部生成JPEG 2000文件的數碼相機都是實現了這個算法;
Reed-Solomon糾錯用於Linux內核、CD驅動、條形碼讀取,而且結合卷積從航行團隊進行圖片傳輸;
自2000年以來,在工業標準中的SAT(布爾知足性問題)求解器的運行時間每一年都在成倍減小。這一發展的一個很是重要的緣由是衝突驅動條款學習算法(Conflict Driven Clause Learning)的使用,它結合了Davis Logemann和Loveland的約束編程和人工智能研究技術的原始論文中關於布爾約束傳播的算法。具體來講,工業建模中SAT被認爲是一個簡單的問題(見討論)。對我來講,這是近代最偉大的成功故事之一,由於它結合了先進的算法、巧妙的設計思路、實驗反饋,並以一致的共同努力來解決這個問題。Malik和Zhang的CACM論文是一個很好的閱讀材料。許多大學都在教授這個算法,但一般是在邏輯或形式化方法的課程中。
但願對您企業應用開發與企業信息化有幫助。 其它您可能感興趣的文章:
《匈牙利 Sapientia 大學的 6 種排序算法舞蹈視頻》
軟件開發的專業化
IT基礎架構規劃方案一(網絡系統規劃)
IT基礎架構規劃方案二(計算機系統與機房規劃規劃)
IT基礎架構規劃方案三(IT基礎軟件和系統規劃)
企業應用之性能實時度量系統演變
雲計算參考架構幾例
智能移動導遊解決方案簡介
人力資源管理系統的演化
若有想了解更多軟件研發 , 系統 IT集成 , 企業信息化 等資訊,請關注個人微信訂閱號:
做者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
該文章也同時發佈在個人獨立博客中-Petter Liu Blog。