用C创建哈希表

时间:2015-07-07 09:22:21

标签: c hashtable

我是Hash tables概念的新手。我正在尝试创建一个非常简单的哈希表来理解这个概念。我已经理解了如何为哈希的目的创建基本哈希函数。但是我不明白如何将它链接到表的其余部分。我对如何开始创建表,查找函数,删除表中的条目等感到困惑。

哈希函数看起来像7

DBAUTH="user1 user1password user2 user2password ... userN userNpassword"

但是我不了解其他部分,比如如何创建表,查找等等。

请有人帮助我。我感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

非常简单地通过将数据分成较小的存储单元(称为存储桶)来放置哈希表。这些内部存储单元由索引访问,索引是存储在存储桶内的值的哈希码。请注意中的s。您需要能够在一个存储桶中存储多个值以支持哈希码冲突。

因此,哈希表需要进行一些基本操作。

  1. 包含 - 要执行包含检查,您需要计算哈希值以查找数据应该位于的存储桶。一旦找到正确的存储桶,您需要检查其中的每个项目是否相等(你怎么选择实现这个。)
  2. 添加 - 向表中添加新项目需要执行与 Contains 类似的检查,以防止您添加任何项目两次。
  3. 删除 - 您可以猜到。以与 Contains 相同的方式查找项目,并将其从存储桶中删除。
  4. 话虽这么说,你需要实现这些桶。简单地说你需要一份清单清单。对于第一层,您需要一些支持索引访问的集合。由于您使用C,因此可以使用简单的数组。我建议你不要为你的桶使用整数范围的整数(你可以这样做,但这会让你更难理解和调试)。只需应用模运算即可正确缩小哈希码的范围。对于第二部分,我建议使用链式列表来支持动态增长。

    因此,您可以根据数组索引找到链接列表,然后处理链接列表中的每个项目以查找正确的项目。这也说明了为什么散列冲突会降低散列表的效率。如果没有哈希冲突,您只需要一个测试来查找项目,这是时间常数。如果您有哈希冲突,则需要检查多个值。

    哈希冲突是返回相同哈希码的两个不同值。

    希望能让您知道如何开始。不要听任何人听。 C是一种非常棒的语言,可以开始使用。

答案 1 :(得分:1)

基本概念很简单:

  1. 使用非常大的数组来存储数据
  2. 使用哈希函数索引数组
  3. 你会发生碰撞 - 所以找出一种处理这些问题的机制(链表可能是最简单的)
  4. 因此,当您想要写入数据时:index = hash_function(); array[index] = data.类似于读取。

    一旦您阅读了有关哈希表的更多信息,您将了解其余内容。

答案 2 :(得分:0)

而是告诉你如何编码,我会告诉你你想要学习的字段的名称:Data Structures and Algorithms

关于此问题的大多数书籍都将为您提供有关如何创建哈希表的示例。我的建议,从比C更容易的语言开始,得到概念,然后回到C.