第二章:哈希表 (Hash Tables)
学习内容
哈希表(Hash Table)是一种非常重要的数据结构,它提供了快速的数据存储和检索能力。
哈希表基础
哈希表是一种键值对存储结构,通过哈希函数将键映射到数组的特定位置。
#### 核心原理
- 哈希函数:将键转换为数组索引的函数
- 冲突处理:当多个键映射到同一位置时的处理机制
- 负载因子:衡量哈希表满度的指标,影响性能
#### 常见实现方式
1. 链表法:将冲突的元素存储在链表中
2. 开放寻址法:在哈希表数组中寻找下一个空位置
LinkedHashMap 和 ArrayHashMap
#### LinkedHashMap
- 通过链表维护插入顺序或访问顺序
- 适用于需要保持元素顺序的场景
#### ArrayHashMap
- 用数组代替链表处理冲突
- 在某些场景下比链表法更高效
重点和难点
重点
1. 理解哈希表的工作原理
2. 掌握哈希函数的设计原则
3. 理解冲突处理机制
难点
1. 哈希函数的设计
2. 不同冲突处理方法的优劣比较
3. 负载因子对性能的影响
练习题
基础题目
1. 两数之和 (Two Sum)
- 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
- 解题思路:使用哈希表存储已遍历的元素及其索引,对每个元素检查 target - 当前元素 是否存在于哈希表中。
- 注意点:确保返回的两个索引不相同。
2. 有效的字母异位词 (Valid Anagram)
- 题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
- 解题思路:使用哈希表统计每个字符出现的次数,比较两个字符串的字符统计结果。
- 注意点:注意处理空字符串和长度不同的情况。
进阶题目
1. LRU缓存 (LRU Cache)
- 题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。
- 解题思路:结合哈希表和双向链表实现,哈希表提供 O(1) 查找,双向链表维护访问顺序。
- 注意点:注意处理容量限制和节点的移动操作。
2. 设计哈希映射 (Design HashMap)
- 题目:不使用任何内建的哈希表库设计一个哈希映射。
- 解题思路:设计哈希函数和冲突处理机制,可以使用链表法处理冲突。
- 注意点:考虑扩容机制和负载因子的控制。
解题思路总结
哈希表的应用场景
1. 快速查找:O(1) 时间复杂度查找
2. 去重:利用哈希表的唯一键特性
3. 计数:统计元素出现次数
设计哈希函数的原则
1. 一致性:相同输入必须产生相同输出
2. 均匀分布:尽量减少冲突
3. 高效性:计算简单快速
学习时间
建议学习时间:1-2天
- 哈希表原理:30分钟
- LinkedHashMap 和 ArrayHashMap:1小时
- 练习题:2-3小时