> 開雜湊法又叫鏈位址法(開鏈法)。
開雜湊法:首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個開雜湊的實現(拉鍊法)桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。
設元素的關鍵碼為37, 25, 14, 36, 49, 68, 57, 11, 雜湊表為ht[12],表的大小為12,雜湊函式為hash(x) = x % 11
hash(37)=4
hash(25)=3
hash(36)=3
hash(49)=5
hash(68)=2
hash(11)=0
使用雜湊函式計算出每個元素所在的桶號,同乙個桶的鍊錶中存放雜湊衝突的元素。
通常,每個桶對應的鍊錶結點都很少,將n個關鍵碼通過某乙個雜湊函式,存放到雜湊表中的m個桶中,那麼每乙個桶中煉表的平均 長度為 。以搜尋平均長度為 的鍊錶代替了搜尋長度為 n 的順序表,搜尋效率快的多。
應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。事實上: 由於開位址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多, 所以使用鏈位址法反而比開位址法節省儲存空間。
hashnode.h
#pragma once
#include
#include
#include
typedef
int keytype;
typedef
int valuetype;
typedef
struct hashnode
hashnode;
typedef
struct hashtable
hashtable;
hashnode*buyhashnode(keytype key, valuetype value);
size_t gethashtableprime(size_t n);
void hashtableinit(hashtable*ht,int size);//初始化
void hashtableprint(hashtable*ht);
int hashtableinsert(hashtable*ht, keytype key, valuetypevalue);//
hashnode* hashtablefind(hashtable*ht, keytype key);//查詢
size_t hashtableerase(hashtable*ht, keytype key);//刪除
void hashtabledestroy(hashtable*ht);//銷毀
hashnode.c
#include"hashnode.h"
hashnode* buyhashnode(keytype key, valuetype value)
void hashtableinit(hashtable*ht,int size)//初始化
size_t gethashtableprime(size_t n)
; for (int i = 0; i < 28; i++)
}return _primelist[27];
}size_t hashfunc(keytype key, size_t n)
int hashtableinsert(hashtable*ht, keytype key, valuetype value)//插入}}
free(ht->table);
ht->_n = newn;//將新錶中的擴容給舊表
ht->table = newht.table;//新錶賦給原表
}size_t index = hashfunc(key, ht->_n);
if (ht->table[index])
cur = cur->_next;}}
node->_next = ht->table[index];
ht->table[index] = node;
ht->_size++;
return0;}
void hashtableprint(hashtable*ht)}}
}hashnode *hashtablefind(hashtable*ht, keytype key)
else
cur = cur->_next;
}return null;}}
}size_t hashtableerase(hashtable*ht, keytype key)
else
if (cur->_key == key)//多個節點
prev = cur;
cur = cur->_next;
}return -1;
}else
}void hashtabledestroy(hashtable*ht)}}
free(ht->table);
ht->table = null;
ht->_n = 0;
ht->_size = 0;
}
test.c
#include"hashnode.h"
void test()
intmain
()
雜湊表查詢 拉鍊法
雜湊查詢 雜湊查詢 雜湊的第一步是使用雜湊函式將鍵對映成索引 1 除留取餘法 最常用的 特點是容易造成堆積,產生衝突 2 特徵值 3 字元型別的 在查詢中陣列的特點是定址容易,插入和刪除困難,鍊錶則相反 雜湊表將二者的特點綜合。雜湊表建表 通過某種關係轉換,使關鍵字適度的分散到制定大小的順序結構中,...
雜湊錶開雜湊法(拉鍊法)
開雜湊法又叫鏈位址法 開鏈法 設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大小為12,雜湊函式為hash x x 11 hash 37 4 hash 25 3 hash 14 3 hash 36 3 hash 49 5 hash 68 2 hash 57 ...
雜湊表(閉雜湊 拉鍊法 雜湊桶)
雜湊表,也稱雜湊表,是一種通過key值來直接訪問在記憶體中的儲存的資料結構。它通過乙個關鍵值的函式 被稱為雜湊函式 將所需的資料對映到表中的位置來訪問資料。關於雜湊表,主要為以下幾個方面 一 雜湊表的幾種方法 1 直接定址法 取關鍵字key的某個線性函式為雜湊位址,如hash key key 或 h...