Hash相關的知識

2021-09-25 04:57:24 字數 1486 閱讀 3828

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 次線性探測

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 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

關於hash相關的總結

1.hashmap為什麼執行緒不安全?1.1 size沒有用volatile修飾,如果多執行緒同時進行put和remove,size的值不准 1.2 如果多執行緒同時put乙個key值相同,會導致其中乙個執行緒的value值丟失 1.3 如果多執行緒正好傳送在resize的時候,也會導致資料的丟失 ...

MySQL的Hash索引相關

hash索引結構使用方式較為侷限,僅適用於 in和 三種,但是由於通過hash可以直接查詢到具體的值,而不用像b 樹那樣每次都從root節點開始遍歷,所以在通常情況下,hash的查詢效率要比b 樹高。hash的缺陷 1.hash不能進行範圍查詢 值在計算hash後,並不能保證計算後的hash值和計算...

雜湊(hash)知識總結

雜湊是常用的演算法思想之一 應用如,給出n個正整數,再給出m個正整數 問 m個數中的每個數是否在n個數中出現過 如果n,m 10 5,可以用遍歷來做,但時間複雜度很大 這時就可以用空間換時間 即設定乙個bool型陣列hash table 100010 這樣在一開始讀入n個正整數時就進行預處理 inc...