算法图解-----十种常用算法
10種算法
1、二叉查找樹
節(jié)點:左子節(jié)點的值都比它小,而右子節(jié)點的值都比它大
插入后無需排序,
2、反向索引
搜索引擎的工作原理,創(chuàng)建一個散列表,鍵為“搜索詞”,值為“包含搜索詞的界面”;
3、傅里葉變換
“給它一杯冰沙,它能告訴你其中包含哪些成分”,例如:給定一首歌曲,傅里葉變換能夠?qū)⑵渲械母鞣N頻率分離出來。使用傅里葉變換可創(chuàng)建類似于“酷狗”這樣的音樂識別軟件。
4、并行算法
為了提高算法的速度,我們需要讓它們能夠在多個內(nèi)核中并行地執(zhí)行。例如:對數(shù)組進行排序,在最佳情況下,排序算法的速度大致為O(nlongn)。但是在快速排序的并行版本所需的時間為O(n)。
并行算法設計的速度提升并非線性的,因此即便你的筆記本電腦裝備了兩個而不是一個內(nèi)核,算法的速度也不可能提高一倍,其中的原因有兩個:
a、并行性管理開銷。假設你要對一個包含1000個元素的數(shù)組進行排序,如何在兩個內(nèi)核之間分配這項任務呢?如果讓每個內(nèi)核對其中500個元素進行排序,再將兩個排好序的數(shù)組合并成一個有序數(shù)組,那么合并也是需要時間的。
b、負載均衡。假設你需要完成10個任務,因此你給每個內(nèi)核都分配5個任務。但分配給內(nèi)核A的任務都很容易,10秒鐘就完成了,而分配給內(nèi)核B的任務都很難,1分種才完成。這意味著有那么50秒,內(nèi)核B在忙死忙活,而內(nèi)核A去閑得很,你如何均勻地分配工作,讓兩個內(nèi)核都一樣忙呢?
要改善性能和可擴展性,并行算法可能是不錯的選擇!
5、MapReduce(Apache Hadoop)
分布式算法,可讓算法在多臺計算機上運行。
例如:你有一個數(shù)據(jù)庫表,包含數(shù)十億乃至數(shù)萬億行,需要對其執(zhí)行復雜的SQL查詢。在這種情況下,你不能使用MySQL,因為數(shù)據(jù)表的行數(shù)超過十億后,它處理起來將很吃力。相反,你需要通過Hadoop來使用MapReduce!
分布式算法非常適合用于在短時間內(nèi)完成海量工作,其中的MapReduce基于兩個簡單的理念:映射(map)函數(shù)和歸并(reduce)函數(shù)。
映射函數(shù):它接受一個數(shù)組,并對其中的每個元素執(zhí)行同樣的處理,是將一個數(shù)組轉(zhuǎn)換為另一個數(shù)組。
例如:如果有100臺計算機,而map能夠自動將工作分配給這些計算機去完成就好了。這樣就可同時下載100個頁面。下載速度將快得多!
歸并函數(shù):將一個數(shù)組轉(zhuǎn)換為一個元素。
MapReduce使用這兩個簡單概念在多臺計算機上執(zhí)行數(shù)據(jù)查詢。數(shù)據(jù)集很大,包含數(shù)十億行時,使用MapReduce只需幾分鐘就可獲得查詢結(jié)果,而傳統(tǒng)數(shù)據(jù)庫可能要耗費數(shù)小時。
6、布隆過濾器和HyperLogLog
惡意網(wǎng)站過濾(海量數(shù)據(jù)處理)。
布隆過濾器:概率型數(shù)據(jù)結(jié)構(gòu)。它提供的答案有可能不對,有可能正確。使用散列表時,答案絕對可靠,使用布隆過濾器時,答案卻是很可能是正確的,但是不可能出現(xiàn)漏報的情況,即如果布隆過濾器說“這個網(wǎng)站未搜集”,就肯定未搜集。
優(yōu)點:在于占用的存儲空間很少。
HyperLogLog:是一種類似于布隆過濾器的算法。HyperLogLog近似地計算集合中不同的元素數(shù),與布隆過濾器一樣,它不能給出準確的答案,但也八九不離十,而占用內(nèi)存空間卻少很多。
7、SHA算法
安全散列算法(SHA)函數(shù)。給定一個字符串,SHA返回其散列值(字符串)。用于創(chuàng)建的散列表的散列函數(shù)根據(jù)字符串生成數(shù)組索引。
“hello”——》2cf24·····
對于每個不同的字符串,SHA生成的散列值都不同;
a、比較文件: 根據(jù)文件的SHA散列值進行比較
b、檢查密碼:根據(jù)SHA散列值進行比較
8、局部敏感的散列算法
SHA還有一個重要特征,那就是局部不敏感的。有時候,希望散列函數(shù)是局部敏感的,在這種情況下,可使用Simhash。如果你對字符串做細微的修改,Simhash生成的散列值也只存在細微的差別。
例如:
Google使用Simhash來判斷網(wǎng)頁是否已搜索;
使用Simhash來判斷論文是否是從網(wǎng)上抄的;
使用Simhash來檢查上傳的內(nèi)容是否侵權;
9、Diffie-Hellman密鑰交換
公鑰與私鑰
10、線性規(guī)劃
線性規(guī)劃用于在給定約束條件上最大限制地改善指定的指標(目標);
Simplex算法
總結(jié)
以上是生活随笔為你收集整理的算法图解-----十种常用算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓APP_ Fragment(3)——
- 下一篇: 安卓APP_ 布局(8) —— 基于 R