字符串散列与线性探测

时间:2010-01-25 05:41:21

标签: c++ hash

我试图弄清楚如何使用线性探测来进行字符串哈希。

基本上,我们的想法是从字典中散列每个字符串(90000个单词),并检索所选单词的字符。

这就是我的所作所为:

  1. 创建了一个大小为2 * 90000的哈希表

  2. 使用简单的哈希函数,我从字典中散列每个单词,得到一个值

  3. 检查哈希表索引是否为空,如果是,则分配值,如果不是,则生成新的哈希值。

  4. 在哈希表中的每个单词后,我执行搜索

  5. 搜索词将在哈希函数之后接收哈希值,并且将检查哈希表中是否存在该值。

  6. 如果存在,它将使用排列比较字符串。如果匹配为真,则输出它。如果没有,它将继续使用新的哈希值。

  7. 问题是,整个过程非常慢......它的索引很好,但搜索需要很长时间。

    我对如何加快这个问题没有想法..

    感谢您抽出宝贵时间阅读本文。

4 个答案:

答案 0 :(得分:3)

首先按字母顺序排列所有字母,然后使用任何哈希算法对结果进行哈希处理(crc32,md5sum,sha1,计算元音,任何东西......虽然计算元音会导致效率低下的解决方案) ,并将该字作为叶节点存储到该哈希条目中(显然在链表中) - 对哈希结果执行mod(x)以将桶限制为2 ^ x。

然后,当你去找一个字谜时,在你的测试字上执行完全相同的“插入”过程:按字母顺序排列字母,然后通过相同的散列函数运行它。然后,对于每个叶节点,将按字母顺序排列的字母列表与保存的单词的按字母顺序排列的列表进行比较。每场比赛都是一个字谜。

(我通常不喜欢提供作业帮助,但是这个太诱人了。现在我想写一个有趣的小程序来找到给定字典中的所有字谜。)

答案 1 :(得分:1)

线性探测用于当您使用的哈希函数为某些输入字符串发生冲突时的情况。在这种情况下,您将按顺序搜索哈希表,直到找到搜索关键字。

这种方法的缺点在于,如果有一次碰撞,会有更多。

一种方法是您可以使用Separate Chaining并使用平衡树作为存储桶来改进查找。

如果您只是想提高性能,请确保没有冲突(在这种情况下,查找完全是O(1)),如果有,请增加哈希表大小。

答案 2 :(得分:-1)

您是否尝试创建给定字符串的Anagrams?在这种情况下,只需在获取字符串作为输入时创建一个字谜。散列这些字符串有什么意义?

编辑:首先,我建议你获取给定字符串的所有排列,然后循环遍历包含所有单词的字典文件。这样做的好处是您不需要在内存中包含所有单词。如果要进一步优化,请根据字符串长度按升序或降序对整个文件进行排序,并继续检查字典文件中的字符串,直到您<=到下一个字符串的长度。

答案 3 :(得分:-1)

如果您要搜索输入词的每个输入,这就是问题的根源。一个单词的字母排列的数量可以变得非常大。

相反,选择一个哈希函数,该函数对于单词的任何排列(anagram)都是相同的。例如,一个基于单词中字符的字符代码的总和。