hash,一般翻譯做「雜湊」,也有直接音譯為「雜湊」的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式
為什麼用雜湊
雜湊對插入,刪除和檢索等操作的時間複雜度可以達到o(1) 儘管雜湊在最差情況下仍然是o(n)
雜湊的組成部分
1.雜湊表
雜湊表是一種資料結構,用以儲存關鍵字以及其關聯的值,雜湊表利用雜湊函式將關鍵字對映到其關聯的值
2.雜湊函式
雜湊函式用於將關鍵字裝換為索引,理想情況下,刪了函式應該將每個可能的關鍵字對映到唯一的槽索引,但在實踐中難以實現。
雜湊函式的方法
1.直接定址法
2.數字分析法
3.平方取中法
取關鍵字平方後的中間幾位為雜湊位址。
4.摺疊法
將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進製)作為雜湊位址,這方法稱為摺疊法。
5.除留餘數法
取關鍵字被某個不大於雜湊表表長m的數p除后所得餘數為雜湊位址。
h(key)=key mod p (p<=m)
6.等等
3.衝突
雜湊陣列用於將每個關鍵字對映到不同的位址空間,但當無法建立乙個將每個關鍵字對映到不同位址的雜湊函式稱為發生了衝突,衝突是指兩個記錄儲存在相同的位置的情況
4.衝突解決的常用技術
分離鏈式法
平方探測法
雙平方探測法
這裡先介紹分離鏈式法
分離鏈式法 就是將雜湊表結合鍊錶來實現
當兩個或多個記錄雜湊到相同位置時,這些記錄將構成鍊錶
實現**
//分離鏈結法
/* * 為執行一次查詢,我們使用雜湊函式來確定究竟遍歷哪個鍊錶
* 然後我們在被確定的鍊錶中執行一次查詢。為執行insert 我們檢查相應的鍊錶看看該元素是否已經處在合適位置。
* */
public
class separatechaininghashtable
@suppresswarnings("unchecked")
public
separatechaininghashtable(int size)
}// 清空雜湊表
public
void
makeempty()
currentsize = 0;
}// 判斷雜湊表中是否包含t
public boolean contain(t t)
// 在雜湊表中插入資料
public
void
insert(t t) }}
// 在雜湊表中移除資料
public
void
remove(t t)
}private
static final int default_table_size = 11;
private list linklist; // 資料陣列
private
int currentsize; // 資料佔據陣列的大小
// 超出陣列範圍 擴大為原來的兩倍
//再雜湊
@suppresswarnings("unchecked")
private
void
rehash() }}
//雜湊函式
private
intmyhash(t t)
// 下乙個素數
private
static
intnextprime(int n)
/*** 是否為素數 素數,有無限個。素數定義為在大於1的自然數中, 除了1和它本身以外不再有其他因數的數稱為素數。
*/private
static boolean isprime(int n)
}
雜湊表資料結構之一 分離鏈結法
查詢樹adt允許對一組元素進行各種操作,而今次總結的雜湊表 hash table adt,不過它只支援二叉查詢樹所允許的一部分操作,雜湊表的實現常常叫做雜湊 hashing 以常數平均時間執行插入 刪除和查詢的技術。理想的雜湊表資料結構只不過是乙個包含有關鍵字的具有固定大小的陣列,把錶的大小叫做ta...
資料結構 分離鏈結法和平方探測法相關例題
現有資料序列和雜湊函式h x x mode 10。1 請畫出用分離鏈結法表示的雜湊表 5分 2 請畫出用平方探測法f i i i表示的雜湊表 5分 3 請計算前兩題中雜湊表的裝載因子和查詢成功的平均查詢長度asl 5分 1 分離鏈結法01 437123 1323 6173 4434456 78941...
資料結構與演算法之雜湊表
介紹 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。應用 看乙個實際需求,google公司的乙個上機題 有乙個公司,...