跳到主要内容

哈希表基础

哈希表解决什么问题?​

  • 目标: 建立 key 到 value 的映射;
  • 能力: 以 O(1) 时间完成查找、插入和删除;
  • 对比: 数组按索引访问也是 O(1), 但索引必须是整数且连续, 无法直接表示任意 key;

哈希表的各项操作复杂度是多少?​

操作时间复杂度
查找O(1)
插入O(1)
删除O(1)
  • 前提: 哈希函数分布均匀, 且冲突控制在可接受范围;
  • 退化: 冲突集中时, O(1) 会退化, 见 哈希冲突;

哈希函数如何把 key 映射到数组下标?​

  • 桶: 数组的每一个空位, 一个桶存一个键值对;
  • 哈希函数: 把较大的输入空间映射到较小的输出空间;
  • 哈希计算: 先用哈希函数得到哈希值, 再对数组长度取模;
index = hash(key) % capacity
  • 结果: key 落到 [0, capacity) 范围内的某个桶上;

为什么要对数组长度取模?​

  • 哈希值范围: 远大于数组长度, 不能直接作为下标;
  • 取模: 把任意哈希值压缩到数组长度范围内;
  • 代价: 压缩把不同的哈希值折到同一个下标, 引入哈希冲突;