雜湊表與雜湊函式 C實現

2021-07-04 20:11:35 字數 1747 閱讀 2388

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中

乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

給定表m,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊(hash)表,

函式f(key)為雜湊(hash) 函式。

雜湊表就是一維陣列,陣列元素是乙個結構體

:結構體有乙個節點指標元素,可以有乙個資料域,也可以有多個資料域,也可以沒有

簡單的說

雜湊表:hash_table = 順序結構+鏈式結構

衝突: 元素x、y、z 分別 % 上 p(預設雜湊表長度)後相等,即應該存放在相同下標下

解決辦法:把y插入到乙個節點中,該節點懸掛到下標為x%p的陣列元素下面,z懸掛到y下面。

//下面給出雜湊表的實現、插入以及列印**:

#includeusing namespace std;

#define p 7 // 雜湊表預設表長

#define $ -1 // 預設初始化的值

#define elemtype int // 值型別

typedef struct bucket_node // 節點型別

bucket_node;

typedef bucket_node hash_table[p]; // 定義雜湊表(實際就是乙個陣列)

/*初始化雜湊表(陣列)元素 */

void init_bucket_node(hash_table &ht, int i)

/* 初始化雜湊表 */

void init_hash_table(hash_table &ht)

} }if(null == p) // 如果 p == null,說明最後乙個節點剛好插滿,需要另外開闢乙個節點的記憶體

return -1; // 如果沒有在現有節點下找到位置,並且開闢節點也失敗的話,x 就真的不能插入了

}/* 列印雜湊表 */

void show_hash_table(hash_table &ht)

} cout<

}}

//下面是測試**: main.cpp

void main()

; // 測試陣列

init_hash_table(ht); // 初始化雜湊表

for(int i = 0; i

insert_new_element(ht, ar[i]); // 陣列元素依次插入雜湊表

show_hash_table(ht); // 列印雜湊表

如果資料較多(足夠多)的話,插入的元素應該均勻地分布在雜湊表中,也就是每個節點元素後面的鏈長度應該相等.

雜湊表與雜湊函式

雜湊表 我們將任意型別元素轉換為整型的過程叫作雜湊。所謂雜湊,實質上是高維空間向低維空間的對映。高維度空間元素數量多,低維空間元素數量少,必定會出現多對一的對映,所以必然出現雜湊衝突。在設計雜湊函式的過程要針對狀態數來進行分析。雜湊函式的本質在做雜湊,處理雜湊碰撞。設計雜湊表應當注重以下兩點 設計雜...

雜湊表(雜湊表) C 實現

雜湊函式就是 關鍵字key 到 值value 的對映 value f key value反映的是關鍵字key的儲存位址。直接定址法 f key a key b 例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。直接定址法的優點是簡單均勻,也不會產生衝突 缺點是該方法適合表比較小...

雜湊表 雜湊函式 雜湊衝突與解決

雜湊表 通過關鍵碼來對映到值的乙個資料結構 雜湊函式 鍵與值對映的乙個對映關係 常用方法 1 直接定址法 f x kx b k b都是常數 一旦確定了雜湊函式,那麼新增 獲取元素都需要通過這個雜湊函式 2 除留餘數法 f x x k k是常數,k m m為儲存位置長度 其他幾種方法 方法名說明 適合...