Hash相關的知識

以下是自己整理的一些相關Hash的知識,希望可以幫助大家!

1.哈希函數的構造方法

       直接定址法、數字分析法、摺疊法 、平方取中法、減去法、基數轉換法 、除留餘數法、隨機乘數法、字符串數值哈希法、旋轉法 、僞隨機數法 

 

2.開哈希和閉哈希

    開哈希表-------鏈式地址法

    閉哈希表-------開放地址法

        開哈希和閉哈希主要的區別在於,隨着哈希表的密集度提高,使用閉哈希時,不僅會與相同哈希值的元素髮生衝突,還容易與不同哈希值的元素髮生衝突;而開哈希則不受哈希表疏密與否的影響,始終只會與相同哈希值的元素衝突而已。所以在密集度變大的哈希表中查找時,顯然開哈希的平均搜索長度不會增長。

3.哈希表是一個在時間和空間上做出權衡的經典例子。如果沒有內存限制,那麼可以直接將鍵作爲數組的索引。那麼所有的查找時間複雜度爲O(1);如果沒有時間限制,那麼我們可以使用無序數組並進行順序查找,這樣只需要很少的內存

4.處理hash衝突有:開放定址法(線性探測法、線性補償探測法、隨機探測法),拉鍊法,建立公共溢出區,再散列法

5.拉鍊法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況

6.哈希法的平均查找長度不隨表中結點數目的增加而增加,而是隨負載因子的增大而增大

      哈希法把要存儲的值映射成哈希值,根據hash值尋址存儲,查找的時間複雜度爲O(1)但也可能出現不同的數據映射成相同的hash值的情況,這是哈希衝突。設計的比較好的哈希函數能夠減少哈希衝突,但是衝突是不可避免的,衝突造成查找的時間增加,因此我們普通的哈希表並不放滿,而是定義一個負載因子。就是哈希表的容量除以哈希表的長度,一般爲0.7左右。

影響哈希表查找速度的不是元素個數,而是負載因子。

7.把整數關鍵碼K散列到有N個槽的散列表,h(k)=k mod N 散列函數是好的散列函數

8.有n個關鍵字具有相同的Hash函數值,則用線性探測法把這n個關鍵字映射到Hash表中需要做n*(n-1) / 2 次線性探測

       第一個關鍵字直接插入,第二個關鍵字要做1次探測,所以類推n個關鍵詞要做0+1+2+...+(n-1) = n*(n-1) / 2 

9.基於哈希的索引和基於樹的索引有什麼區別?

(1).hash索引僅滿足“=”、“IN”和“<=>”查詢,不能使用範圍查詢
因爲hash索引比較的是經常hash運算之後的hash值,因此只能進行等值的過濾,不能基於範圍的查找,因爲經過hash算法處理後的hash值的大小關係,並不能保證與處理前的hash大小關係對應。
(2)、hash索引無法被用來進行數據的排序操作
由於hash索引中存放的都是經過hash計算之後的值,而hash值的大小關係不一定與hash計算之前的值一樣,所以數據庫無法利用hash索引中的值進行排序操作。
(3)、對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合併後再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。
(4)、Hash 索引遇到大量Hash值相等的情況後性能並不一定就會比B-Tree索引高。
對於選擇性比較低的索引鍵,如果創建 Hash 索引,那麼將會存在大量記錄指針信息存於同一個 Hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下。

 

 

 

 

 

 

 

 

 

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