【问题标题】:Hash function for String Data字符串数据的哈希函数
【发布时间】:2015-06-22 21:53:29
【问题描述】:

我正在使用 C++ 语言处理哈希表,我需要一个用于字符串数据的哈希函数。我尝试过的一个哈希函数是添加 ascii 代码并使用模数 (%100)。

我的实际要求是找到完全匹配或以给定模式开头的单词。

例如:给定的模式是“comp”。然后我想得到所有以comp开头的单词。 (例如:公司、计算机、comp 等)我可以使用哈希来执行此操作吗,因为尝试过的哈希函数只能找到完全匹配。 所以谁能给我推荐一个适合这个要求的哈希函数。

【问题讨论】:

  • 为什么必须使用哈希表?你试过了吗?
  • 如果您坚持使用哈希表,您可以将每个单词的所有前缀存储在哈希表中。但其他数据结构可能更好。

标签: c++ string hash


【解决方案1】:

听起来您真正需要的是字典排序。您可以通过使用排序数据结构(如标准集或映射)或使用向量和 std::sort 算法来做到这一点。请注意,C++ 排序比标准 C qsort 快。

【讨论】:

  • 非常感谢。我需要以非常快的方式搜索数据。所以我不确定std map或vector的性能是否足以处理大量数据
  • 好吧,std::sort 内部使用了 qsort 算法(但使用 C++ 优化,如比较函数的编译时绑定而不是 C 中的函数指针),所以它几乎和它一样快得到。以及基于平衡树的数据结构,即在对数时间内映射和设置、插入和搜索。另外,你没有重新哈希的问题,100% 的时间保证性能,而不是像哈希表那样的 99%。
【解决方案2】:

前缀匹配最好使用trie 处理。

基本上,这是一个树形结构,每个节点上都保留一个键中的一个字符。连接从根到给定节点的路径中不同节点的字符将生成该节点的密钥。

搜索是将搜索到的键的每个字符与子节点进行比较的树的下降问题。一旦你消耗了所有的字符,剩下的子树就是所有以搜索键为前缀的键。

【讨论】:

  • 非常感谢您的回复。我已经试过了。它符合我搜索良好的要求。但问题是我的数据非常大并且经常更新。所以我需要为每次更新重建树。因此,更新非常缓慢。这就是为什么我想转向类似哈希的结构。您对符合我要求的快速更新数据结构有任何想法吗?
  • @user1308004,我相信 更新 树应该不会很昂贵(删除/添加/查询操作 complexity 取决于密钥的长度,而不是数字元素)。现在,如果您的问题是您并不真正知道更改了哪些数据并且需要在每次更新时从头开始重建树,那么这是一个不同的问题:也许您可以添加一个侧面哈希映射可以帮助您确定什么是新的,什么是旧的。
猜你喜欢
  • 2015-03-09
  • 2020-07-04
  • 2013-05-08
相关资源
最近更新 更多