1. 程式人生 > >演算法圖解-----十種常用演算法

演算法圖解-----十種常用演算法

10種演算法
1、二叉查詢樹
節點:左子節點的值都比它小,而右子節點的值都比它大
插入後無需排序,

2、反向索引
搜尋引擎的工作原理,建立一個散列表,鍵為“搜尋詞”,值為“包含搜尋詞的介面”;

3、傅立葉變換
“給它一杯冰沙,它能告訴你其中包含哪些成分”,例如:給定一首歌曲,傅立葉變換能夠將其中的各種頻率分離出來。使用傅立葉變換可建立類似於“酷狗”這樣的音樂識別軟體。

4、並行演算法
為了提高演算法的速度,我們需要讓它們能夠在多個核心中並行地執行。例如:對陣列進行排序,在最佳情況下,排序演算法的速度大致為O(nlongn)。但是在快速排序的並行版本所需的時間為O(n)。

並行演算法設計的速度提升並非線性的,因此即便你的膝上型電腦裝備了兩個而不是一個核心,演算法的速度也不可能提高一倍,其中的原因有兩個:
a、並行性管理開銷

。假設你要對一個包含1000個元素的陣列進行排序,如何在兩個核心之間分配這項任務呢?如果讓每個核心對其中500個元素進行排序,再將兩個排好序的數組合併成一個有序陣列,那麼合併也是需要時間的。
b、負載均衡。假設你需要完成10個任務,因此你給每個核心都分配5個任務。但分配給核心A的任務都很容易,10秒鐘就完成了,而分配給核心B的任務都很難,1分種才完成。這意味著有那麼50秒,核心B在忙死忙活,而核心A去閒得很,你如何均勻地分配工作,讓兩個核心都一樣忙呢?
要改善效能和可擴充套件性,並行演算法可能是不錯的選擇!

5、MapReduce(Apache Hadoop)
分散式演算法,可讓演算法在多臺計算機上執行。
例如:你有一個數據庫表,包含數十億乃至數萬億行,需要對其執行復雜的SQL查詢。在這種情況下,你不能使用MySQL,因為資料表的行數超過十億後,它處理起來將很吃力。相反,你需要通過Hadoop來使用MapReduce!
分散式演算法非常適合用於在短時間內完成海量工作,其中的MapReduce基於兩個簡單的理念:對映

(map)函式和歸併(reduce)函式。
對映函式:它接受一個數組,並對其中的每個元素執行同樣的處理,是將一個數組轉換為另一個數組。
例如:如果有100臺計算機,而map能夠自動將工作分配給這些計算機去完成就好了。這樣就可同時下載100個頁面。下載速度將快得多!
歸併函式:將一個數組轉換為一個元素。
MapReduce使用這兩個簡單概念在多臺計算機上執行資料查詢。資料集很大,包含數十億行時,使用MapReduce只需幾分鐘就可獲得查詢結果,而傳統資料庫可能要耗費數小時。

6、布隆過濾器和HyperLogLog
惡意網站過濾(海量資料處理)。
布隆過濾器:概率型資料結構。它提供的答案有可能不對,有可能正確。使用散列表時,答案絕對可靠,使用布隆過濾器時,答案卻是很可能是正確的,但是不可能出現漏報的情況,即如果布隆過濾器說“這個網站未蒐集”,就肯定未蒐集。
優點:在於佔用的儲存空間很少。

HyperLogLog:是一種類似於布隆過濾器的演算法。HyperLogLog近似地計算集合中不同的元素數,與布隆過濾器一樣,它不能給出準確的答案,但也八九不離十,而佔用記憶體空間卻少很多。

7、SHA演算法
安全雜湊演算法(SHA)函式。給定一個字串,SHA返回其雜湊值(字串)。用於建立的散列表的雜湊函式根據字串生成陣列索引。
“hello”——》2cf24·····
對於每個不同的字串,SHA生成的雜湊值都不同;

a、比較檔案: 根據檔案的SHA雜湊值進行比較
b、檢查密碼:根據SHA雜湊值進行比較

8、區域性敏感的雜湊演算法
SHA還有一個重要特徵,那就是區域性不敏感的。有時候,希望雜湊函式是區域性敏感的,在這種情況下,可使用Simhash。如果你對字串做細微的修改,Simhash生成的雜湊值也只存在細微的差別。
例如:
Google使用Simhash來判斷網頁是否已搜尋;
使用Simhash來判斷論文是否是從網上抄的;
使用Simhash來檢查上傳的內容是否侵權;

9、Diffie-Hellman金鑰交換
公鑰與私鑰

10、線性規劃
線性規劃用於在給定約束條件上最大限制地改善指定的指標(目標);
Simplex演算法