【问题标题】:How to hash Double linked list node in C?如何在C中散列双链表节点?
【发布时间】:2012-08-22 07:44:48
【问题描述】:

我正在实现一个数据结构;项目在范围内的双链表。我想在 O(1) 中查找一个项目是否存在。为此,我想散列键将是项目和值将是节点的节点。

在 Java 中,有内置函数支持这种特性。

编辑:简而言之,我想要 C 语言中的 hashMap 之类的东西。

我应该怎么做才能在 C 中实现它?

【问题讨论】:

  • 你的意思是C语言中的hashCode实现吗?如果是这样 - 没有类似的开箱即用。
  • 我不认为他的意思是hashCode() 实现;我认为您对该功能的作用感到困惑。我认为他的意思是 Map 或 HashMap 之类的东西,它们允许您将项目放入集合中并在 O(1) 中检索它们。
  • 您需要做更多的研究并澄清您想要的内容。请注意,您没有提供任何示例,即使是伪代码,也没有提供您尝试过的示例。另外,这是做作业的吗?哈希双向链表的实现是学习 C 的一个相当入门的任务。
  • @NathanielFord 好吧,如果他说“结构”——我同意你的观点,但他说“功能”——这与 hashCode 而不是 HashMap 更相关。
  • @jdevelop 不是在他谈论键值对时,但我同意他并没有说清楚。没有样本输入/输出,甚至没有讨论他是否想要 O(1) 或摊销 O(1),某些树结构最好。或者他是否关心插入时间。

标签: c linked-list hash


【解决方案1】:

创建一个名为“buckets”的数组,其中包含键和值,以及用于创建链表的可选指针。

当您使用键访问哈希表时,您使用自定义哈希函数处理该键,该函数将返回一个整数。然后你取结果的模数,这就是你的数组索引或“桶”的位置。然后你检查未散列的密钥和存储的密钥,如果匹配,那么你找到了正确的地方。

否则,您就发生了“冲突”,必须爬过链表并比较键,直到匹配为止。 (注意一些实现使用二叉树而不是链表来解决冲突)。

查看这个快速哈希表实现:

http://attractivechaos.awardspace.com/khash.h.html

【讨论】:

    【解决方案2】:

    如果您将项目存储在链表中,那么也将它们存储在哈希中以进行遏制测试似乎......不是最理想的。只需使用哈希表开始,如果您需要它不支持的操作(O(1) 包含测试),请停止使用链表。

    【讨论】:

    • 哈希表不保留顺序。如果您关心迭代顺序,将链表添加到哈希表是相当常见的。
    • 我想在列表中实现其他几个功能,例如入队和出队并删除 O(1) 中的项目。因此,散列节点是有意义的。但是,我怎样才能在 C 中实现呢?
    • @Aashish 通过学习数据结构理论和实践......关于这个主题有很多好书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2011-03-12
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多