天天看點

《算法圖解》學習筆記—第11章 10種算法簡介前言

前言

羅列了一些以後可能會用到的算法,并簡單介紹了一下,以後具體用到的時候再詳細學習。

1. 樹

二叉查找樹(binary search tree),一種資料結構。

對于其中的每個節點,左子節點的值都比它小,而右子節點的值都比它大。

《算法圖解》學習筆記—第11章 10種算法簡介前言

假設你要查找Maggie。為此,你首先檢查根節點。

《算法圖解》學習筆記—第11章 10種算法簡介前言

Maggie排在David的後面,是以你往右邊找。

《算法圖解》學習筆記—第11章 10種算法簡介前言

查找過程跟二分查找一樣。在二叉查找樹中查找節點時,平均運作時間為O( l o g n log n logn),但在最糟的情況下所需時間為O( n n n);而在有序數組中查找時,即便是在最糟情況下所需的時間也隻有O( l o g n log n logn),是以你可能認為有序數組比二叉查找樹更佳。然而,二叉查找樹的插入和删除操作的速度要快得多。

《算法圖解》學習筆記—第11章 10種算法簡介前言

二叉查找樹也存在一些缺點,例如,不能随機通路某個元素。有處于平衡狀态和不平衡狀态的二叉查找樹。

可以研究一下其他樹相關的資料結構:B樹,紅黑樹,堆,伸展樹。

2. 反向索引

反向索引(inverted index) 也是一種資料結構,常用于建立搜尋引擎。

搜尋包含指定單詞的頁面,利用一個散清單,将單詞映射到包含它的頁面,這種資料結構被稱為反向索引。

《算法圖解》學習筆記—第11章 10種算法簡介前言

3. 傅裡葉變換

傅裡葉變換(Fourier transform)是一種線性的積分變換。傅裡葉就是一種變換,從時間到頻率的變化或其互相轉化。

4. 并行算法

為提高算法的速度,你需要讓它們能夠在多個核心中并行地執行!

在最佳情況下,排序算法的速度大緻為O( n l o g n n log n nlogn)。衆所周知,對數組進行排序時,除非使用并行算法,否則運作時間不可能為O( n n n)!對數組進行排序時,快速排序的并行版本所需的時間為O( n n n)。

并行算法設計起來很難,要確定它們能夠正确地工作并實作期望的速度提升也很難。有一點是确定的,那就是速度的提升并非線性的,是以即便你的筆記本電腦裝備了兩個而不是一個核心,算法的速度也不可能提高一倍,其中的原因有兩個:

  • 并行性管理開銷。假設你要對一個包含1000個元素的數組進行排序,如何在兩個核心之間配置設定這項任務呢?如果讓每個核心對其中500個元素進行排序,再将兩個排好序的數組合并成一個有序數組,那麼合并也是需要時間的。
  • 負載均衡。假設你需要完成10個任務,是以你給每個核心都配置設定5個任務。但配置設定給核心A的任務都很容易,10秒鐘就完成了,而配置設定給核心B的任務都很難,1分鐘才完成。這意味着有那麼50秒,核心B在忙死忙活,而核心A卻閑得很!你如何均勻地配置設定工作,讓兩個核心都一樣忙呢?

要改善性能和可擴充性,并行算法可能是不錯的選擇!

5. MapReduce

有一種特殊的并行算法正越來越流行,它就是分布式算法。在并行算法隻需兩到四個核心時,完全可以在筆記本電腦上運作它,但如果需要數百個核心呢?在這種情況下,可讓算法在多台計算機上運作。MapReduce是一種流行的分布式算法,可通過流行的開源工具Apache Hadoop來使用它。

分布式算法非常适合用于在短時間内完成海量工作,其中的MapReduce基于兩個簡單的理念:映射(map)函數和歸并(reduce)函數。

映射是将一個數組轉換為另一個數組。

《算法圖解》學習筆記—第11章 10種算法簡介前言

歸并函數是将很多項歸并為一項。

《算法圖解》學習筆記—第11章 10種算法簡介前言

6. 布隆過濾器和HyperLogLog

沒看懂,名字太長,到時候需要再學習,哈哈哈哈哈

7. SHA 算法

安全雜湊演算法(secure hash algorithm,SHA) 。給定一個字元串,SHA傳回其散列值。

SHA是一個散列函數,它生成一個散列值——一個較短的字元串。用于建立散清單的散列函數根據字元串生成數組索引,而SHA根據字元串生成另一個字元串。

《算法圖解》學習筆記—第11章 10種算法簡介前言

比較檔案

可使用SHA來判斷兩個檔案是否相同,這在比較超大型檔案時很有用。假設你有一個4 GB的檔案,并要檢查朋友是否也有這個大型檔案。為此,你不用通過電子郵件将這個大型檔案發送給朋友,而可計算它們的SHA散列值,再對結果進行比較。

《算法圖解》學習筆記—第11章 10種算法簡介前言

檢查密碼

假設Gmail遭到攻擊,攻擊者竊取了所有的密碼!你的密碼暴露了嗎?沒有,因為Google存儲的并非密碼,而是密碼的SHA散列值!你輸入密碼時,Google計算其散列值,并将結果同其資料庫中的散列值進行比較。

《算法圖解》學習筆記—第11章 10種算法簡介前言

Google隻是比較散列值,是以不必存儲你的密碼!SHA被廣泛用于計算密碼的散列值。這種雜湊演算法是單向的。你可根據字元串計算出散列值。

《算法圖解》學習筆記—第11章 10種算法簡介前言

但你無法根據散列值推斷出原始字元串。

《算法圖解》學習筆記—第11章 10種算法簡介前言

SHA實際上是一系列算法:SHA-0、SHA-1、SHA-2和SHA-3。

8. 局部敏感的雜湊演算法

SHA還有一個重要特征,那就是局部不敏感的。假設你有一個字元串,并計算了其散列值。

《算法圖解》學習筆記—第11章 10種算法簡介前言

如果你修改其中的一個字元,再計算其散列值,結果将截然不同!

《算法圖解》學習筆記—第11章 10種算法簡介前言

這很好,讓攻擊者無法通過比較散列值是否類似來破解密碼。

有時候,你希望結果相反,即希望散列函數是局部敏感的。在這種情況下,可使用Simhash。如果你對字元串做細微的修改,Simhash生成的散列值也隻存在細微的差别。這讓你能夠通過比較散列值來判斷兩個字元串的相似程度。

9. Diffie-Hellman 密鑰交換

Diffie-Hellman算法解決了如下兩個問題:

  • 雙方無需知道加密算法。他們不必會面協商要使用的加密算法。
  • 要破解加密的消息比登天還難。

Diffie-Hellman使用兩個密鑰:公鑰和私鑰。顧名思義,公鑰就是公開的,可将其釋出到網站上,通過電子郵件發送給朋友,或使用其他任何方式來釋出。你不必将它藏着掖着。有人要向你發送消息時,他使用公鑰對其進行加密。加密後的消息隻有使用私鑰才能解密。隻要隻有你知道私鑰,就隻有你才能解密消息!

Diffie-Hellman算法及其替代者RSA依然被廣泛使用。

10. 線性規劃

線性規劃用于在給定限制條件下最大限度地改善指定的名額。

例如,假設你所在的公司生産兩種産品:襯衫和手提袋。襯衫每件利潤2美元,需要消耗1米布料和5粒扣子;手提袋每個利潤3美元,需要消耗2米布料和2粒扣子。你有11米布料和20粒扣子,為最大限度地提高利潤,該生産多少件襯衫、多少個手提袋呢?在這個例子中,目标是利潤最大化,而限制條件是擁有的原材料數量。

所有的圖算法都可使用線性規劃來實作。線性規劃是一個寬泛得多的架構,圖問題隻是其中的一個子集。線性規劃使用Simplex算法。

繼續閱讀