《數據結構與算法之美》學習筆記(5) 哈希算法 紅黑樹

哈希算法

(1)什麼是哈希算法?

將任意長度的二進制值串映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,而通過原始數據映射之後得到的二進制值串就是哈希值

(2)設計好的哈希算法要求

要想設計一個優秀的哈希算法,需要滿足的幾點要求:

  • 從哈希值不能反向推導出原始數據(所以哈希算法也叫單向哈希算法);
  • 對輸入數據非常敏感,哪怕原始數據只修改了一個 Bit,最後得到的哈希值也大不相同;
  • 散列衝突的概率要很小,對於不同的原始數據,哈希值相同的概率非常小;
  • 哈希算法的執行效率要儘量高效,針對較長的文本,也能快速地計算出哈希值。

(3)哈希算法的應用

  • 安全加密

    最常用於加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。除了這兩個之外,當然還有很多其他加密算法,比如DES(Data Encryption Standard,數據加密標準)、AES(Advanced Encryption Standard,高級加密標準)。

  • 唯一標識

    先來舉一個例子。如果要在海量的圖庫中,搜索一張圖是否存在,不能單純地用圖片的元信息(比如圖片名稱)來比對,因爲有可能存在名稱相同但圖片內容不同,或者名稱不同圖片內容相同的情況。那該如何搜索呢?

    可以把每個圖片的唯一標識,和相應的圖片文件在圖庫中的路徑信息,都存儲在散列表中。當要查看某個圖片是不是在圖庫中的時候,先通過哈希算法對這個圖片取唯一標識,然後在散列表中查找是否存在這個唯一標識。

  • 數據校驗

    用於校驗數據的完整性和正確性。

  • 散列函數

紅黑樹

1. 什麼是“平衡二叉查找樹”?

平衡二叉樹的嚴格定義是這樣的:二叉樹中任意一個節點的左右子樹的高度相差不能大於 1。從這個定義來看,完全二叉樹、滿二叉樹其實都是平衡二叉樹,但是非完全二叉樹也有可能是平衡二叉樹。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yGS61OOi-1587047234283)(C:\Users\lin\AppData\Roaming\Typora\typora-user-images\1585316287765.png)]
但是很多平衡二叉查找樹其實並沒有嚴格符合上面的定義(樹中任意一個節點的左右子樹的高度相差不能大於 1),比如紅黑樹,它從根節點到各個葉子節點的最長路徑,有可能會比最短路徑大一倍。

所以,平衡二叉查找樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”、比較“平衡”,不要出現左子樹很高、右子樹很矮的情況。這樣就能讓整棵樹的高度相對來說低一些,相應的插入、刪除、查找等操作的效率高一些。

所以,如果設計一個新的平衡二叉查找樹,只要樹的高度不比 log2n 大很多(比如樹的高度仍然是對數量級的),儘管它不符合前面講的嚴格的平衡二叉查找樹的定義,但仍然可以說,這是一個合格的平衡二叉查找樹。

2. 如何定義一棵“紅黑樹”?

紅黑樹的英文是“Red-Black Tree”,簡稱 R-B Tree。它是一種不嚴格的平衡二叉查找樹,

它的定義是不嚴格符合平衡二叉查找樹的定義的。那紅黑樹究竟是怎麼定義的呢?

顧名思義,紅黑樹中的節點,一類被標記爲黑色,一類被標記爲紅色。除此之外,一棵紅黑樹還需要滿足這樣幾個要求:

  • 根節點是黑色的;
  • 每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存儲數據;
  • 任何相鄰的節點都不能同時爲紅色,也就是說,紅色節點是被黑色節點隔開的;
  • 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;

這裏的第二點要求“葉子節點都是黑色的空節點”,稍微有些奇怪,它主要是爲了簡化紅黑樹的代碼實現而設置的。

兩個紅黑樹的圖例
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iSE57heA-1587047234295)(C:\Users\lin\AppData\Roaming\Typora\typora-user-images\1585316746267.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章