Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地图的实施<;字符串,字符串>;在C中_C_Data Structures - Fatal编程技术网

地图的实施<;字符串,字符串>;在C中

地图的实施<;字符串,字符串>;在C中,c,data-structures,C,Data Structures,由于某种原因,我必须自己实现这一点,不能使用libs。 为了快速映射,首先,我将键映射到一个整数,并将该整数用作内部键。然后我实现了Map,它提供了映射函数。然而,当我使用字符串键计算内部整数键时,有时我从不同的字符串中得到相同的整数。我怎样才能解决这个问题?你无法避免这一点。可能的字符串多于整数,因此哈希冲突即将发生。阅读hashmaps——它是一种明确考虑冲突并围绕冲突工作的数据结构。这就是所谓的冲突,但最简单的方法是使Hashmap中的每个bucket都成为具有相同哈希的项目列表。然后在g

由于某种原因,我必须自己实现这一点,不能使用libs。
为了快速映射,首先,我将键映射到一个整数,并将该整数用作内部键。然后我实现了Map,它提供了映射函数。然而,当我使用字符串键计算内部整数键时,有时我从不同的字符串中得到相同的整数。我怎样才能解决这个问题?

你无法避免这一点。可能的字符串多于整数,因此哈希冲突即将发生。阅读hashmaps——它是一种明确考虑冲突并围绕冲突工作的数据结构。

这就是所谓的冲突,但最简单的方法是使Hashmap中的每个bucket都成为具有相同哈希的项目列表。然后在get上,您所要做的就是遍历列表,直到找到您要查找的项目

地图数据结构和“冲突”不能分开。您启动实现的方式似乎很好,下面是您应该如何处理冲突:

在地图中添加新条目

  • 键计算
    hashcode
  • 从hashcode计算
    索引
    (或多或少
    索引
    =
    hashcode值
    %
    键集大小
  • 如果
    键集[index]
    不为空
  • 如果键集[索引]!=键(即,对于字符串,使用strcmp)增量
    索引
    模数
    键集的大小
    ,然后转到3
  • 放入
    入口集[索引]
  • 从地图中获取值

  • 键计算
    hashcode
  • 从hashcode计算
    索引
    (或多或少
    索引
    =
    hashcode值
    %
    键集大小
  • 如果
    键集[index]
    不为空
  • 如果键集[索引]!=键(即,对于字符串,使用strcmp)增量
    索引
    模数
    键集的大小
    ,然后转到3
  • 如果
    键集[index]
    为null,则返回null
  • return
    entryset[index]
  • 从地图中删除条目

  • 键计算
    hashcode
  • 从hashcode计算
    索引
    (或多或少
    索引
    =
    hashcode值
    %
    键集大小
  • 如果
    键集[index]
    不为空
  • 如果键集[索引]!=键(即,对于字符串,使用strcmp)增量
    索引
    模数
    键集的大小
    ,然后转到3
  • keyset[index]
    entryset[index]
    设置为空
  • 如您所见,您可以将步骤1到3放入函数
    int findIndexFromKey(Map*Map,char*key)并且大部分工作已经完成

    **编辑**


    当然,在添加新条目之前(或添加新条目时),您还必须检查地图是否已满,否则您将不受限制地循环。

    如果已经添加了相同的密钥,“添加新条目”中的循环将永远不会终止。是的,我现在正在修复它。虽然一般的想法是这样的,但您的删除函数也不正确-如果您添加具有相同哈希的
    key1
    ,然后添加
    key2
    ,则删除
    key1
    key2
    会丢失(不会被
    get
    函数找到)。