在C </string,>中实现Map <string,string =“”>

时间:2011-01-05 14:18:54

标签: c data-structures

出于某种原因,我必须自己实现,并且不能使用libs。 为了使其快速映射,首先,我将键映射到整数,并将该整数用作内部键。然后我实现了Map,它给了我映射函数。但是,当我使用字符串键来计算内部整数键时,有时我会从不同的字符串中获得相同的整数。我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:5)

你无法避免这种情况。有更多可能的字符串而不是整数,因此哈希冲突迫在眉睫。阅读hashmaps - 它是一种明确地将冲突考虑在内并围绕它们工作的数据结构。

答案 1 :(得分:2)

地图数据结构和“碰撞”不能分开。您开始实施的方式似乎很好,以下是您应该如何处理冲突:

在地图中添加新条目

  1. hashcode
  2. 计算key
  3. 从哈希码计算index(或多或少index = hashcode valuesize of keyset
  4. 如果keyset[index]不为空
    1. 如果keyset [index]!= key(即对于字符串,请使用strcmp)增加index模数size of keyset,然后转到3
  5. value放入entryset[index]
  6. 从地图中获取值

    1. hashcode
    2. 计算key
    3. 从哈希码计算index(或多或少index = hashcode valuesize of keyset
    4. 如果keyset[index]不为空
      1. 如果keyset [index]!= key(即对于字符串,请使用strcmp)增加index模数size of keyset,然后转到3
    5. 如果keyset[index]为null,则返回null
    6. return entryset[index]
    7. 从地图中删除条目

      1. hashcode
      2. 计算key
      3. 从哈希码计算index(或多或少index = hashcode valuesize of keyset
      4. 如果keyset[index]不为空
        1. 如果keyset [index]!= key(即对于字符串,请使用strcmp)增加index模数size of keyset,然后转到3
      5. keyset[index]entryset[index]设为null
      6. 如您所见,您可以将第1步到第3步放入函数int findIndexFromKey(Map *map, char *key);中,大部分工作已完成

        ** 编辑 **

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

答案 2 :(得分:1)

这就是所谓的冲突,但最简单的方法是让Hashmap中的每个存储桶都包含具有相同哈希值的项目列表。然后在 get 上,你所要做的就是遍历列表,直到找到你要找的项目。