哈希算法题目:设计一个哈希映射,支持操作: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):删除键值对。

要求解决哈希冲突(多个键映射到同一位置),使用链地址法(链表存储冲突元素)。


解题步骤

  1. 设计数据结构

    • 定义桶(buckets)数量,例如 BASE = 769(质数减少冲突)。
    • 每个桶是一个链表,存储键值对 (key, value)
  2. 哈希函数

    • 使用简单取模:hash(key) = key % BASE
  3. 操作实现

    • Put 操作
      1. 计算桶索引 index = key % BASE
      2. 遍历桶内链表,若找到相同键,更新值;否则在链表末尾添加新节点。
    • Get 操作
      1. 计算桶索引,遍历链表查找键,找到返回值,否则返回-1。
    • Remove 操作
      1. 计算桶索引,遍历链表找到键,删除对应节点。
  4. 复杂度分析

    • 假设键均匀分布,每个桶长度近似 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,遍历链表找到值40
  • remove(1) → 索引=1,删除节点(1,10)

通过链表解决冲突,确保键值对正确存储。

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