散列
- 散列(hashing)是一种数据结构:包含有关键字的固定大小的数组(散列表)。能够以常数平均时间执行插入、删除和查找操作。
- 散列函数(hash function):将每个关键字到散列表中的映射,理想情况下应该能保证不同关键字映射到散列表的不同单元。
一个简单的散列函数
Index Hash(const char *key, int TableSize)
{
unsigned int HashVal = 0;
while(*key != '\0')
HashVal += *key++;
return HashVal % TableSize;
}
分离链表法
- 当一个元素插入到散列表中时,另一个元素已经存在(散列值相同),那么就会产生一个冲突。
- 分离链表法能够有效地解决冲突。
- 使用分离链表法,散列表的每个单元是一个链表(以散列表单元为头节点)。
- 当插入元素与散列中已存在元素散列值相同时,元素插入到相应散列单元的链表(头插法)中,从而相同散列值的元素共存在同一个链表中。
分离链表法散列表数据结构
typedef struct Node {
ElemType data;
struct Node *next;
}LNode, *LinkList;
typedef struct HashTb {
int tablesize;
LinkList* TableList;
}*HashTable;
分离链表法的查找操作
- 查找一个关键字是否在散列表中,首先根据关键字值和散列函数求相应的散列值。
- 根据散列值,定位散列表中相应的散列单元,接着遍历该散列单元的链表来查找该关键字值是否在该链表中。
LNode* Find(HashTable H, ElemType key) // 在哈希表中查找指定关键字,返回一个链表的结点
{
LinkList L = H->TableList[Hash(key, H->tablesize)]; // 借助哈希函数,求出包含给定关键字的子链表所在位置
LNod