出于某种原因,我必须自己实现,并且不能使用libs。 为了使其快速映射,首先,我将键映射到整数,并将该整数用作内部键。然后我实现了Map,它给了我映射函数。但是,当我使用字符串键来计算内部整数键时,有时我会从不同的字符串中获得相同的整数。我该如何解决这个问题呢?
答案 0 :(得分:5)
你无法避免这种情况。有更多可能的字符串而不是整数,因此哈希冲突迫在眉睫。阅读hashmaps - 它是一种明确地将冲突考虑在内并围绕它们工作的数据结构。
答案 1 :(得分:2)
地图数据结构和“碰撞”不能分开。您开始实施的方式似乎很好,以下是您应该如何处理冲突:
在地图中添加新条目
hashcode
key
index
(或多或少index
= hashcode value
%size of keyset
)keyset[index]
不为空
index
模数size of keyset
,然后转到3 value
放入entryset[index]
从地图中获取值
hashcode
key
index
(或多或少index
= hashcode value
%size of keyset
)keyset[index]
不为空
index
模数size of keyset
,然后转到3 keyset[index]
为null,则返回null entryset[index]
从地图中删除条目
hashcode
key
index
(或多或少index
= hashcode value
%size of keyset
)keyset[index]
不为空
index
模数size of keyset
,然后转到3 keyset[index]
和entryset[index]
设为null 如您所见,您可以将第1步到第3步放入函数int findIndexFromKey(Map *map, char *key);
中,大部分工作已完成
** 编辑 **
当然,您还必须在添加新条目之前(或同时)检查地图是否已满,否则您将无限循环。
答案 2 :(得分:1)
这就是所谓的冲突,但最简单的方法是让Hashmap中的每个存储桶都包含具有相同哈希值的项目列表。然后在 get 上,你所要做的就是遍历列表,直到找到你要找的项目。