散列与分离链表法

本文介绍了散列数据结构及其在解决冲突时采用的分离链表法。详细阐述了散列函数的概念,以及分离链表法如何处理冲突,包括散列表数据结构、查找和插入操作的步骤。此外,还提供了C/C++实现分离链表法散列表的代码示例。

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

散列

  • 散列(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;    // Linklist类型的指针TableList,表示一个数组的头指针,该数组的元素为一个个LinkList链表
}*HashTable;

分离链表法的查找操作

  • 查找一个关键字是否在散列表中,首先根据关键字值和散列函数求相应的散列值。
  • 根据散列值,定位散列表中相应的散列单元,接着遍历该散列单元的链表来查找该关键字值是否在该链表中。
LNode* Find(HashTable H, ElemType key)      // 在哈希表中查找指定关键字,返回一个链表的结点
{
    LinkList L = H->TableList[Hash(key, H->tablesize)];     // 借助哈希函数,求出包含给定关键字的子链表所在位置
    LNod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值