對於查詢,有順序表直接遍歷,有折半查詢直到查詢成功。但是這都需要不斷的比較,每一次查詢都需要重新遍歷,所以當資料龐大時是非常耗時的。雜湊表是一種可以避免多次比較,直接通過關鍵字就可以得到要查詢的記錄記憶體儲存位置。例如就像是乙個函式,每乙個自變數都對應著乙個函式值,即
這屬於雜湊技術,不需要比較就可以獲得需要查詢的儲存位置。
雜湊表查詢步驟:
在儲存時,通過自定義設定的雜湊函式計算記錄的雜湊位址,並按照此位址儲存該記錄。
在查詢記錄時,可以通過同樣的雜湊函式計算雜湊位址,按照此位址訪問雜湊表
直接定址法:例如現在要求對0~100歲的人口數字統計表。那麼我們對年齡這個關鍵字就可以直接用年齡的數字作為位址。此時f(key)=key;也就是說可以取關鍵字的某個線性函式值為雜湊位址。但此方法只適用於知道關鍵字的分布情況,適合查詢表較小而且連續的情況。
數字分析法:可以直接去某一段數字的一小截,例如手機號碼136***x8744其中8744是真正的使用者號,就可以用來當關鍵字。這個方法適用於關鍵字位數比較大而且關鍵字分布均勻,位數的均勻的情況。
平方取中法:這個方法最簡單直接平方再加起來然後取中間部分。例如1234,則平方為1522756,中間部分為227,則277就是雜湊位址。此方法適用於不知道關鍵字的分布,而且位數不是很大的情況。
摺疊法:將關鍵字從左到右分割成幾段相等的部分再把這幾部分相加起來,然後取後幾位作為雜湊位址。例如:9876543210,987|654|321|0,求和987+654+321+0=1962,再取後3位962為雜湊位址。此方法適用於關鍵字位數比較多的情況且不需要知道關鍵字的分布。
除留餘數法:這種是最常用的構造雜湊函式方法。對於雜湊表長為m的雜湊函式: f(key)=key mod p(p≤m);但是這種方法容易產生衝突。衝突就是兩個不同的關鍵字的雜湊位址相同,產生衝突的兩個關鍵字稱為同義詞。例如:12mod11,144mod11都是為1,即雜湊位址相同。
處理雜湊衝突:
**詳解:
開放定址法:所謂開放定址就是一旦發生了衝突就去尋找下乙個空的雜湊位址來儲存。例如:雜湊表長為11,f(12)=1;當需要儲存144時,因為f(144)=1出現衝突,則繼續尋找下乙個空位址f(f(144)+1)mod12。
#includeusing namespace std;
#define ok 1
#define success 1
#define fail 0
#define hashsize 12 //雜湊表大小
#define nullkey '#'
struct node ;
struct hashtable ;
int m;
//初始化
bool inithashtable(hashtable *h)
//獲取對應的位址
int hash(int key)
//插入元素到雜湊表
void inserthash(hashtable *h)
//利用關鍵字在雜湊表搜尋
bool searchhash(hashtable *h, int &addr)
} return success;
}int main()
return 0;
}
資料結構 雜湊表(雜湊表)查詢
0 前言 順序表 乙個乙個挨個查詢 有序查詢 二分查詢方法 雜湊表查詢 記錄的儲存位置 f 關鍵字 雜湊技術是在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到固定值key的對映f key 若查詢集合中存在這個...
大話資料結構 雜湊表查詢(雜湊表)
雜湊技術 在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key f 雜湊函式 雜湊函式 採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表。關鍵字對應的記錄儲存位置稱為雜湊位址。雜湊技術既是一種儲存方法,也是一種查詢方...
資料結構之雜湊表查詢 雜湊表
這個知識點不難,話不多說,直接上 如下 1 include stdafx.h 2 include3 define success 1 4 define unsuccess 0 5 define hashsize 12 定義雜湊表長為陣列的長度 6 define nullkey 3276878 usi...