雜湊表的實現

2021-07-24 07:03:07 字數 2574 閱讀 2095

雜湊表

(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 例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。直接定址法的優點是簡單均勻,也不會產生衝突 缺點是該方法適合表比較小...