散列之开放定址法

开放定址散列法是解决冲突的一种策略,它通过寻找其他空单元来避免链表的使用。本文介绍了开放定址法的数据结构,特别是使用平方探测法的查找和插入操作,并讨论了当表填满时的再散列过程。内容包括如何在C/C++中实现平方探测开放定址散列表的相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开放定址散列法

  • 分离链表法缺点:需要指针,给新单元分配地址需要时间,导致算法速度减慢,同时还需要实现另一种数据结构。
  • 开放定址法:如果有冲突发生,尝试选择另外得单元,直到找出空的单元为止。

开放定址散列法数据结构

  • 散列表单元不是链表,而是一个个散列项:包含关键字和相关信息(是否为空),数据结构声明如下:
typedef struct Entry {      // 定义哈希表元素的结构
    ElemType data;
    KindOfEntry Info;
}HashEntry;
  • 散列表的数据结构包含:表大小,一个散列项类型的数组(头指针),结构声明如下
typedef struct HashTb {     // 定义哈希表的结构
    int tablesize;          // 哈希表的大小
    HashEntry* TableList;   // 定义一个元素为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);               // 先在表中确定key是否存在,即哈希项的信息是否为Legitimate表示已被装填了
    if (H->TableList[pos].Info != Legitimate)               
    {
        H->TableList[pos].data = key;           // 向表中插入数据
        H-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值