雜湊表(也叫雜湊表),是根據關鍵字值而直接進行訪問的資料結構。
通過把關鍵字值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。
雜湊函式的構造方法:
(1)直接定址法
(2)除留餘數法
(3)平方取中法
(4)摺疊法
(5)數值分析法
本文採用除留餘數法構造雜湊函式。
h(k) = (h(k) + i) % m; 其中i = 1, 2, …, m為雜湊表大小。
構造雜湊函式的目的是減少衝突,但要完全避免衝突是不可能的,只能盡可能減少衝突。
處理衝突的方法:
(1)開放定址法
(2)二次探測法
(3)鏈位址法(拉鍊法)
根據原始陣列建立乙個雜湊表,雜湊表也為乙個陣列,且要求雜湊表有固定大小。
本文採用開放定址法處理衝突。
當由h(k)算出的位置不為空時,則通過已經構造的雜湊函式來尋找新的空位置。
從h(k)開始往後逐個搜尋空位置,如果後面沒有空位置,則從頭開始搜尋,直到搜尋到空位置,或者回到h(k)停止搜尋。(回到h(k)則說明搜尋失敗)
舉例:取h(k) = (h(k) + i) %11,將關鍵字序列20, 30, 70, 15, 8, 12, 18, 63, 19儲存到雜湊表中,如下圖:
平均搜尋長度可以用來衡量乙個搜尋演算法,在上圖中有:
平均查詢長度 = (1 x 5 + 2 x 1 + 3 x 1+ 4 x 1+ 5 x 1)/ 9 = 19/9
具體c++實現**如下,在vs2010測試通過:
#include
using
namespace
std;
void arrayhashtablesearch(int arr, int searchvalue)
else
comparetimes++;
}cout
<
/雜湊表已滿,則插入失敗}}
//查詢
nindex = searchvalue % tablesize;
if(searchvalue == table[nindex])
cout
<
else
comparetimes++;
}cout
<
/查詢失敗
}}int _tmain(int argc, _tchar* argv)
; //雜湊表
arrayhashtablesearch(arr, 5);
arrayhashtablesearch(arr, 10);
return
0;}
開放定址法實現雜湊表
使用分離鏈結法實現雜湊表時需要額外的空間來儲存指標,而且需要給新單元動態分配空間,導致演算法的速度減慢。開放定址法一次分配表的大小,可以使用線性雜湊,平方雜湊,雙重雜湊等等方法,這些方法除了雜湊函式不相同之外,對於雜湊表的大小要求也不一樣。平方雜湊需要使表的大小是儲存元素的兩倍以上,這樣總能找到空槽...
雜湊表(上) 開放定址法
概述 雜湊表,又稱雜湊表,hash表。雜湊表是一種特殊的資料結構,它同陣列 鍊錶以及二叉排序樹等相比較有很明顯的區別,它能夠快速定位到想要查詢的記錄,而不是與表中存在的記錄的關鍵字進行比較來進行查詢。這個源於雜湊表設計的特殊性,它採用了函式對映的思想將記錄的儲存位置與記錄的關鍵字關聯起來,從而能夠很...
雜湊 開放定址法
引起雜湊衝突的乙個原因可能是 雜湊函式設計不夠合理。雜湊函式設計原則 雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個位址時,其值域必須在0到m 1之間 雜湊函式計算出來的位址能均勻分布在整個空間中 雜湊函式應該比較簡單 閉雜湊typedef int keytype typede...