【问题标题】:C hashtable library natively supporting multiple values per keyC 哈希表库本机支持每个键的多个值
【发布时间】:2011-11-08 00:07:21
【问题描述】:

如果您想为一个键存储多个值,总有可能在哈希表和值之间插入一个列表。但是,我认为这是相当低效的,因为:

无论如何,哈希表必须解决冲突,某种列表遍历也是如此。它不会在找到与查询键匹配的存储桶中的第一个键时停止,而是可以继续遍历存储桶,这可能比在遵循另一个间接路径之后再遍历另一个列表提供更好的缓存性能。

是否有人知道默认情况下支持此功能的库实现(理想情况下也是闪亮的、快速的、哈希表以及 BSD 或类似许可)?我浏览了几个库,但没有一个符合我的要求,glib 的 datasets 最接近,虽然存储的是记录,而不是列表。

【问题讨论】:

  • 就缓存性能而言,肯定走单链表和跳转到新链表是一样的吗?在这两种情况下,您都只是遵循指示。
  • 存储桶很有可能已经在缓存中,单独的列表没有那么多。整个事情当然取决于实现,在桶本身只是一个链表的情况下,你是完全正确的。
  • 快速谷歌给了我这个:uthash.sourceforge.net
  • @WoLpH ,来自文档:“与任何哈希一样,每个项目都必须有一个唯一的密钥。您的应用程序必须强制密钥唯一性。在将项目添加到哈希表之前,您必须首先知道(如果有疑问,请检查!)该密钥尚未在使用中。您可以使用 HASH_FIND 检查哈希表中是否已存在密钥。"
  • @barsoap:你完全正确,我读过那部分。我会继续搜索:)

标签: c hashtable


【解决方案1】:

所以...类似于multimap

Libgee,以GLib 为基础,提供MultiMap。 (它是用 Vala 编写的,但被转换为纯 C。)

【讨论】:

  • 从语义上讲,是的,从操作上讲,libgee 在哈希表和值之间添加了一个列表,这在 abstractmultimap.vala:86 中很明显
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多