地图的实施<;字符串,字符串>;在C中
由于某种原因,我必须自己实现这一点,不能使用libs。地图的实施<;字符串,字符串>;在C中,c,data-structures,C,Data Structures,由于某种原因,我必须自己实现这一点,不能使用libs。 为了快速映射,首先,我将键映射到一个整数,并将该整数用作内部键。然后我实现了Map,它提供了映射函数。然而,当我使用字符串键计算内部整数键时,有时我从不同的字符串中得到相同的整数。我怎样才能解决这个问题?你无法避免这一点。可能的字符串多于整数,因此哈希冲突即将发生。阅读hashmaps——它是一种明确考虑冲突并围绕冲突工作的数据结构。这就是所谓的冲突,但最简单的方法是使Hashmap中的每个bucket都成为具有相同哈希的项目列表。然后在g
为了快速映射,首先,我将键映射到一个整数,并将该整数用作内部键。然后我实现了Map,它提供了映射函数。然而,当我使用字符串键计算内部整数键时,有时我从不同的字符串中得到相同的整数。我怎样才能解决这个问题?你无法避免这一点。可能的字符串多于整数,因此哈希冲突即将发生。阅读hashmaps——它是一种明确考虑冲突并围绕冲突工作的数据结构。这就是所谓的冲突,但最简单的方法是使Hashmap中的每个bucket都成为具有相同哈希的项目列表。然后在get上,您所要做的就是遍历列表,直到找到您要查找的项目 地图数据结构和“冲突”不能分开。您启动实现的方式似乎很好,下面是您应该如何处理冲突: 在地图中添加新条目
键计算hashcode
索引
(或多或少索引
=hashcode值
%键集大小
)键集[index]
不为空
索引
模数键集的大小
,然后转到3值
放入入口集[索引]
键计算hashcode
索引
(或多或少索引
=hashcode值
%键集大小
)键集[index]
不为空
索引
模数键集的大小
,然后转到3键集[index]
为null,则返回nullentryset[index]
键计算hashcode
索引
(或多或少索引
=hashcode值
%键集大小
)键集[index]
不为空
索引
模数键集的大小
,然后转到3keyset[index]
和entryset[index]
设置为空int findIndexFromKey(Map*Map,char*key)代码>并且大部分工作已经完成
**编辑**
当然,在添加新条目之前(或添加新条目时),您还必须检查地图是否已满,否则您将不受限制地循环。如果已经添加了相同的密钥,“添加新条目”中的循环将永远不会终止。是的,我现在正在修复它。虽然一般的想法是这样的,但您的删除函数也不正确-如果您添加具有相同哈希的key1
,然后添加key2
,则删除key1
,key2
会丢失(不会被get
函数找到)。