开放定址散列法
- 分离链表法缺点:需要指针,给新单元分配地址需要时间,导致算法速度减慢,同时还需要实现另一种数据结构。
- 开放定址法:如果有冲突发生,尝试选择另外得单元,直到找出空的单元为止。
开放定址散列法数据结构
- 散列表单元不是链表,而是一个个散列项:包含关键字和相关信息(是否为空),数据结构声明如下:
typedef struct Entry {
ElemType data;
KindOfEntry Info;
}HashEntry;
- 散列表的数据结构包含:表大小,一个散列项类型的数组(头指针),结构声明如下
typedef struct HashTb {
int tablesize;
HashEntry* TableList;
}*HashTable;
使用平方探测法散列法查找散列表
Index Find(HashTable H, ElemType key) // 使用平方探测散列法,在哈希表中查找指定关键字,返回一个位置下标
{
Index pos = Hash(key, H->tablesize); // 借助哈希函数,求出包含给定关键字的位置
int collnum = 0; // 初始化冲突数
while (H->TableList[pos].Info != Empty && H->TableList[pos].data != key)
{
pos += 2 * ++collnum - 1;
if (pos >= H->tablesize)
pos -= H->tablesize;
}
return pos;
}
使用平方探测法散列表的插入操作
- 定理:使用平方探测法,如果表大小是素数,则当表至少有一半是空的时候,总能插入一个新的元素
void insert(HashTable H, ElemType key)
{
Index pos = Find(H, key);
if (H->TableList[pos].Info != Legitimate)
{
H->TableList[pos].data = key;
H-