雜湊表
(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的
資料結構
。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做
雜湊函式
,存放記錄的
陣列叫做
雜湊表。
給定表m,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊(hash)表,函式f(key)為雜湊(hash) 函式。
定址方法:
1.
直接定址
法
:取關鍵字或關鍵字的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a·key + b,其中a和b為常數(這種
雜湊函式
叫做自身函式)。若其中h(key)中已經有值了,就往下乙個找,直到h(key)中沒有值了,就放進去。
2.除留餘數法:取關鍵值被某個不大於雜湊表長m的數p除后的所得的餘數為雜湊位址。hash(key)= key % p。
3.平方取中法:當無法確定關鍵字中哪幾位分布較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作為雜湊位址。這是因為:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的雜湊位址。
雜湊衝突/雜湊碰撞
不同的key值經過雜湊函式hash(key)處理以後可能產生相同的值雜湊位址,我們稱這種情況為雜湊衝突。任意的雜湊函式都不能避免產 生衝突。
雜湊表在查詢過程中,關鍵碼的比較次數,取決於產生衝突的多少,產生的衝突少,查詢效率就高,產生的衝突多,查詢效率就低。因此,影響產生衝突多少的因素,也就是影響查詢效率的因素。影響產生衝突多少有以下三個因素:
1. 雜湊函式
是否均勻;
2. 處理衝突的方法;
3. 雜湊表 的裝填因子。
雜湊表的載荷因子定義為:α= 填入表中的元素個數 / 雜湊表的長度
α是雜湊表 裝滿程度的標誌因子。由於表長是定值,α與「填入表中的元素個數」成正比,所以,α越大,填入表中的元素較多,產生衝突的可能性就越大;α越小,填入表中的元素較少,產生衝突的可能性就越小。對於開放定址法,載荷因子應該嚴格控制在0.7-0.8之間,超過0.8時,cpu的快取不命中率會曲線上公升
#include
#include
using namespace std;
enum status //判斷表中選中位置是否為空;
template
struct hashnode};
template
class hashtable
bool insert(const k& key,const v& value)
_table[index]._key=key;
_table[index]._value=value;
_table[index]._sta=exist;
_size++;
return true;}
node* find(const k& key)
else
continue;}
return null;}
void display()
cout<< endl;}
protected:
size_t hashfunc(const k& key) //hash函式
void checksize() //判斷儲存空間
}this->swap(hash);}}
size_t getnextprime(size_t num) //增容素數數列(使用素數做除數可以減少雜湊衝突),素數表對齊做雜湊表的容量,降低雜湊衝突
;for(size_t i=0;i<28;i++)
else
continue;}
return 4294967291; //返回最大容量約為4g
雜湊表(雜湊表)的實現
雜湊函式直接用key size的形式,size為雜湊表的大小。衝突處理採用平方探測法,為保證可以探測到整個雜湊表空間,雜湊表大小設定為4k 3形式的素數。當雜湊表中的元素過多時會造成效能下降,這時應該倍增雜湊表的大小,重新計算原來雜湊表中每個元素在新的雜湊表中的位置。雜湊表的實現 hashtable...
雜湊表 雜湊表 的實現原理
雜湊表可以表述為,是一種可以根據關鍵字快速查詢資料的資料結構。通常情況下,不論雜湊表中資料有多少,增加,刪除,改寫資料的複雜度平均都是o 1 效率非常高。如果說每乙個資料它都對應著乙個固定的位置,那我們查詢特定乙個資料時,就可以直接檢視這個資料對應的位置是否存在資料。乙個形象的例子就是學生在教室中的...
雜湊表(雜湊表) C 實現
雜湊函式就是 關鍵字key 到 值value 的對映 value f key value反映的是關鍵字key的儲存位址。直接定址法 f key a key b 例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。直接定址法的優點是簡單均勻,也不會產生衝突 缺點是該方法適合表比較小...