哈希算法题目:设计一个哈希映射,支持操作:put(key, value)、get(key)、remove(key),并解决哈希冲突
字数 743 2025-10-28 11:34:06
哈希算法题目:设计一个哈希映射,支持操作:put(key, value)、get(key)、remove(key),并解决哈希冲突
题目描述
设计一个哈希映射(HashMap),需实现以下操作:
put(key, value):若键已存在,更新值;否则插入新键值对。get(key):返回键对应的值,若键不存在返回-1。remove(key):删除键值对。
要求解决哈希冲突(多个键映射到同一位置),使用链地址法(链表存储冲突元素)。
解题步骤
-
设计数据结构
- 定义桶(buckets)数量,例如
BASE = 769(质数减少冲突)。 - 每个桶是一个链表,存储键值对
(key, value)。
- 定义桶(buckets)数量,例如
-
哈希函数
- 使用简单取模:
hash(key) = key % BASE。
- 使用简单取模:
-
操作实现
- Put 操作:
- 计算桶索引
index = key % BASE。 - 遍历桶内链表,若找到相同键,更新值;否则在链表末尾添加新节点。
- 计算桶索引
- Get 操作:
- 计算桶索引,遍历链表查找键,找到返回值,否则返回-1。
- Remove 操作:
- 计算桶索引,遍历链表找到键,删除对应节点。
- Put 操作:
-
复杂度分析
- 假设键均匀分布,每个桶长度近似
n/BASE,操作时间复杂度平均 O(n/BASE)。
- 假设键均匀分布,每个桶长度近似
详细示例
假设 BASE=3,依次操作:
put(1, 10)→ 索引=1,桶1添加(1,10)put(2, 20)→ 索引=2,桶2添加(2,20)put(4, 40)→ 索引=1(冲突),桶1链表变为(1,10)→(4,40)get(4)→ 索引=1,遍历链表找到值40remove(1)→ 索引=1,删除节点(1,10)
通过链表解决冲突,确保键值对正确存储。