Data Structures in C++:哈希


Hash中文翻譯爲 “散列”,以下統稱其音譯 “哈希

哈希映射

哈希映射(Hash Map)是根據 鍵值對 (Key value)直接進行訪問的數據結構。通過把鍵值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函數叫做哈希函數,存放記錄的數組叫做哈希表。也就是說,使用哈希函數將鍵映射到存儲桶(哈希表)中。
在這裏插入圖片描述
在C++STL中的實現爲:unordered_map 鍵值對的集合,按照鍵生成散列,鍵是唯一的。

特點:

  • 如果兩個哈希值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入一定是不相同的。
  • 如果兩個哈希值相同,兩個輸入值很可能(極大概率)是相同的,但也可能不同,這種情況稱爲“哈希衝突”或“哈希碰撞”
  • 抗篡改能力:對於一個數據塊,哪怕只改動其一個比特位,其hash值的改動也會非常大
  • 哈希映射是“非對稱”的,是一個從明文到密文的不可逆的映射, 只能加密, 沒有解密

哈希集

哈希集合是集合數據結構的實現之一,用於存儲非重複值。C++STL中的實現爲 unordered_set 唯一鍵的集合,按照鍵生成散列

哈希衝突

當兩對數據的哈希值相同時,就發生了哈希衝突,也叫作哈希碰撞。
在這裏插入圖片描述
在實際應用中,無論如何構造哈希函數,衝突是無法完全避免的。處理哈希衝突的兩種主要的方法:開放尋址法和拉鍊法。

  • 開放尋址法:當發生地址衝突時,按照某種方法繼續探測哈希表中的其他存儲單元,直到找到空位置爲止。比如線性探查(存放到下一個空間中)、二次探查、僞隨機探測、再哈希法等 參考:解決哈希衝突的三種方法

    在這裏插入圖片描述

  • 拉鍊法:將發生衝突的元素都插入到頭指針爲 ST[ i ] 的鏈表中。這種方法有點近似於鄰接表的基本思想,且這種方法適合於衝突比較嚴重的情況。

    在這裏插入圖片描述

哈希查找

哈希查找是通過哈希映射直接計算數據元素的存儲地址進行查找的一種方法。步驟如下:

  1. 用給定的哈希函數構造哈希表;
  2. 根據選擇的衝突處理方法解決地址衝突;
  3. 在哈希表的基礎上執行哈希查找。

對於無衝突的Hash表而言,查找複雜度爲O(1),是速度最快的查找方法。

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