1、 雜湊:由資料項的值來確定資料存放的位置。雜湊表中的儲存位置被成為槽。
2、雜湊函式:實現從資料項到儲存槽的轉換的函式稱為雜湊函式。
3、 槽號:雜湊函式返回的資料項的儲存位置。
求餘雜湊:
方法:
將資料項除以雜湊表的大小,得到的餘數作 為槽號。
實際上「求餘數」方法會以不同形式出現在所有 雜湊函式裡 因為雜湊函式返回的槽號必須在雜湊表大小範圍 之內,所以一般會對雜湊表大小求餘。
資料的查詢:
只需要使用同乙個雜湊函式,對查詢項進行計算,測試下返回的槽號所對應的槽中是否有 資料項即可
不足:
可能會出現」衝突「現象。即:兩個不同的資料項通過求餘數後得到相同的槽號。
完美雜湊函式:
1. 方法:
給定一組資料項,如果乙個雜湊函式能把 每個資料項對映到不同的槽中。對於固定的一組資料,總是能想方設法設計出完美雜湊函式。
2. 不足:
但是如果這組資料經常變動的話,很難有乙個完美的雜湊函式(即會出現些許的衝突,但!衝突其實也不致命的,我們可以妥善的處理他們!)
3. 設計完美雜湊函式的方法:
①設計出乙個足夠大的雜湊表(即:擴大雜湊表的容量)使得所有可能出現的資料項都能夠佔據不同的槽。(不實用)
②退而求其次,好的雜湊函式需要具備特性 :
衝突最少(近似完美)、
計算難度低(額外開銷小)、
充分分散資料項(節約空間)
雜湊的應用之一
區域鏈區域鏈介紹:區域鏈是一種分布式資料庫,通過網路連線的節點 每個節點都儲存著整個資料庫所有資料 任何地點存入的資料都會完成同步。
其本質特徵:去中心化,即不存在任何控制中心,協調中心節點,所有節點都是平等的 ,無法被控制。
區塊鏈由乙個個區塊(block)組成,區 塊分為頭(head)和體(body)
區塊頭記錄了一些元資料和鏈結到前乙個區塊的資訊。
生成時間、前乙個區塊(head+body)的雜湊值
區域鏈具有不可修改性:
由於雜湊值具有抗修改性,任何對某個區 塊資料的改動必然引起雜湊值的變化,為了不導致這個區塊脫離鏈條,就需要修改所有 後續的區塊。
由於有「工作量證明」的機制,這種大規模修改 不可能實現的,除非掌握了全網51%以的計算力。
雜湊函式設計
1.摺疊法:
將資料項按照位數分為若干段,再將幾段數字相加, 最後對雜湊表大小求餘,得到雜湊值。
有時候摺疊法還會包括乙個隔數反轉的步驟
2.平方取中(計算量稍大):
首先將資料項做平方運算,然後取平方數的中間兩位,再對雜湊表的大小求餘。
3.非數項:
也可以對非數字的資料項進行雜湊, 把字串中的每個字元看作ascii碼即可,再將這些整數累加,對雜湊表大小求餘。
注意:
這樣的雜湊函式對所有的變位詞都 返回相同的雜湊值 為了防止這一點,可以將字串所在的位置作為 權重因子,乘以ord值。
4.數字分析法:
對於給定的關鍵碼集合,分析所有關鍵碼中各位數字出現的頻率,從中選出分布情況較好的若干數字作為雜湊函式的值。
雜湊函式設計基本法則
1.
雜湊函式不能太複雜,否則將成為儲存過程和查詢過程的計算負擔。
2.
雜湊值應盡可能地均勻分布
衝突的解決方案:
1.解決衝突:
乙個系統化的方法在雜湊表中儲存發生衝突資料中的第二個資料項。
2.解決方法
開放定址:即 再找乙個開放的空槽來儲存 最簡單的就是從衝突的槽開始往後掃瞄,直到碰 到乙個空槽 如果到雜湊表尾部還未找到,則從首部接著掃瞄 。
向後逐個槽尋找的方法則是開放定址技術 中的「線性探測。
3.缺點:
容易有聚集趨勢。
4.改進:
將逐個探測改為跳躍式探測(再雜湊)。
資料結構與演算法之雜湊表
介紹 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。應用 看乙個實際需求,google公司的乙個上機題 有乙個公司,...
資料結構與演算法 七 之雜湊表
雜湊表,是根據關鍵碼值而進行訪問的資料結構。通過碼值對映到表中的乙個位置來訪問以加快查詢速度。這個對映函式叫雜湊函式,存放記錄的陣列叫雜湊表。使用陣列 鍊錶的形式實現乙個簡單的hashtable,實現以下函式。雜湊函式以最簡單的取模為例。首先定義乙個鍊錶節點,儲存key與value。class no...
資料結構與演算法簡記 雜湊演算法
將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。md5 md5 message digest algorithm,md5 訊息摘要演算法 sha secure hash algorithm,安全雜湊演算法 借助h...