散列表

概述

散列表(Hash Table)是一种基于哈希函数将键映射到数组位置的数据结构,支持平均 的查找、插入和删除操作。其核心挑战在于冲突处理——当两个不同的键被映射到同一位置时,需要通过链表法开放寻址法解决。散列表是符号表、数据库索引和缓存的核心实现。

定义

散列表(Hash Table)

散列表使用哈希函数 将来自全域 的键映射到大小为 的数组(桶)中。

两个关键参数:

  • 装载因子(load factor):,其中 为已存储元素数
  • 哈希函数:将键均匀映射到桶中,理想情况下每个键等概率映射到每个位置

冲突解决方法

链表法(Chaining):每个桶维护一个链表,冲突的元素追加到链表中。

开放寻址法(Open Addressing):冲突时按某种探查序列寻找下一个空桶。常见探查策略:

  • 线性探查:
  • 二次探查:
  • 双重散列:

核心性质

性质描述备注
平均查找(简单均匀散列假设下)取决于装载因子
最坏查找所有键映射到同一桶
插入/删除平均 删除在开放寻址法中较复杂
装载因子 越大,冲突越多
空间效率链表法可 ,开放寻址法需 需要权衡空间和时间

性能分析(简单均匀散列假设)

在简单均匀散列假设下(每个键等概率映射到每个位置,且独立):

操作链表法开放寻址法
不成功搜索
成功搜索

应用场景

  • 符号表:编译器中的变量名查找
  • 数据库索引:快速定位数据记录
  • 缓存实现:LRU 缓存等
  • 去重:快速判断元素是否已出现
  • 字典/Map:编程语言中的关联数组(Python dict, Java HashMap)

参见