哈希算法
(1)什麼是哈希算法?
將任意長度的二進制值串映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,而通過原始數據映射之後得到的二進制值串就是哈希值。
(2)設計好的哈希算法要求
要想設計一個優秀的哈希算法,需要滿足的幾點要求:
- 從哈希值不能反向推導出原始數據(所以哈希算法也叫單向哈希算法);
- 對輸入數據非常敏感,哪怕原始數據只修改了一個 Bit,最後得到的哈希值也大不相同;
- 散列衝突的概率要很小,對於不同的原始數據,哈希值相同的概率非常小;
- 哈希算法的執行效率要儘量高效,針對較長的文本,也能快速地計算出哈希值。
(3)哈希算法的應用
-
安全加密
最常用於加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。除了這兩個之外,當然還有很多其他加密算法,比如DES(Data Encryption Standard,數據加密標準)、AES(Advanced Encryption Standard,高級加密標準)。
-
唯一標識
先來舉一個例子。如果要在海量的圖庫中,搜索一張圖是否存在,不能單純地用圖片的元信息(比如圖片名稱)來比對,因爲有可能存在名稱相同但圖片內容不同,或者名稱不同圖片內容相同的情況。那該如何搜索呢?
可以把每個圖片的唯一標識,和相應的圖片文件在圖庫中的路徑信息,都存儲在散列表中。當要查看某個圖片是不是在圖庫中的時候,先通過哈希算法對這個圖片取唯一標識,然後在散列表中查找是否存在這個唯一標識。
-
數據校驗
用於校驗數據的完整性和正確性。
-
散列函數
紅黑樹
1. 什麼是“平衡二叉查找樹”?
平衡二叉樹的嚴格定義是這樣的:二叉樹中任意一個節點的左右子樹的高度相差不能大於 1。從這個定義來看,完全二叉樹、滿二叉樹其實都是平衡二叉樹,但是非完全二叉樹也有可能是平衡二叉樹。
但是很多平衡二叉查找樹其實並沒有嚴格符合上面的定義(樹中任意一個節點的左右子樹的高度相差不能大於 1),比如紅黑樹,它從根節點到各個葉子節點的最長路徑,有可能會比最短路徑大一倍。
所以,平衡二叉查找樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”、比較“平衡”,不要出現左子樹很高、右子樹很矮的情況。這樣就能讓整棵樹的高度相對來說低一些,相應的插入、刪除、查找等操作的效率高一些。
所以,如果設計一個新的平衡二叉查找樹,只要樹的高度不比 log2n 大很多(比如樹的高度仍然是對數量級的),儘管它不符合前面講的嚴格的平衡二叉查找樹的定義,但仍然可以說,這是一個合格的平衡二叉查找樹。
2. 如何定義一棵“紅黑樹”?
紅黑樹的英文是“Red-Black Tree”,簡稱 R-B Tree。它是一種不嚴格的平衡二叉查找樹,
它的定義是不嚴格符合平衡二叉查找樹的定義的。那紅黑樹究竟是怎麼定義的呢?
顧名思義,紅黑樹中的節點,一類被標記爲黑色,一類被標記爲紅色。除此之外,一棵紅黑樹還需要滿足這樣幾個要求:
- 根節點是黑色的;
- 每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存儲數據;
- 任何相鄰的節點都不能同時爲紅色,也就是說,紅色節點是被黑色節點隔開的;
- 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;
這裏的第二點要求“葉子節點都是黑色的空節點”,稍微有些奇怪,它主要是爲了簡化紅黑樹的代碼實現而設置的。
兩個紅黑樹的圖例: