散列表和子串匹配

时间:2012-05-10 08:10:14

标签: algorithm hashtable

我有数百个键,例如:

  • redapple
  • maninred
  • foraman
  • blueapple

我有与这些密钥相关的数据,数据是一个字符串,最后有相关的密钥。

  • redapple:the-tree-has-redapple
  • maninred:she-saw-the-maninred
  • foraman:他们买了现在的foraman
  • blueapple:它是令人惊讶的 - 但它是一个蓝莓

我希望使用哈希表和哈希函数来根据密钥记录数据,我希望能够从表中提取数据。

我知道使用哈希函数和哈希表,这里没有问题。

可是;

我希望给程序一个字符串作为子字符串,并检索匹配键的数据。

例如:

我必须提供“红色”并且必须能够获得

  • redapple:the-tree-has-redapple
  • maninred:she-saw-the-maninred

作为输出。

我必须提供“apple”并且必须能够获得

  • redapple:the-tree-has-redapple
  • blueapple:它是令人惊讶的 - 但它是一个蓝莓

作为输出。

我只能考虑搜索所有密钥,如果它们有匹配的子字符串,是否还有其他解决方案?如果我搜索每个查询的所有关键字符串,那么使用散列是不必要的,没有意义,是吗?

但是,搜索子串的所有键是O(N),我希望用O(1)来解决问题。

使用散列,我可以散列键,例如“redapple”到例如 943 ,并且“maninred”到例如的 332

查询man给出字符串“red”我怎么能从 943 332 中发现键有“红色”子串?这不符合我的思维技能。

感谢任何建议,想法。

3 个答案:

答案 0 :(得分:3)

在哈希表中无法很好地完成。给定一个子字符串 - 您无法预测整个字符串的散列结果 1

合理的替代方案是使用suffix tree。后缀树中的每个终端都将保存完整字符串的引用列表,此后缀与。

相关

给定子字符串t,如果它确实是集合中某些s的子字符串,那么x的后缀为s - 这样t 1}}是x的前缀。通过在读取t时遍历后缀树,并找到从那里到达的节点可到达的所有终端。这些终端包含所有需要的字符串。


(1)假设合理的散列函数,如果每个元素hashCode() == 0,则可以明显地预测散列值。

答案 1 :(得分:2)

可能你应该使用n-gramm的反转索引,同样的方法用于拼写校正。对于单词 redapple ,您将拥有以下一组3-gramms red,eda,dap,app,ppl,ple 。对于每个n-gramm,您将拥有一个包含它的字符串列表。例如,对于红色,它将是

红色 - > maninred,redapple

必须订购此列表中的单词。当你想要找到包含一个给定子串的所有字符串时,你潜入了n-gramm上的子串并拦截了n-gramm的单词列表。

这个alogriphm不是O(n),但它练习它有足够的速度。

答案 2 :(得分:-1)

我最近研究了这个问题,并且我确信这是不可能完成的。我希望哈希表可以帮助我提高像您一样的搜索速度,但会让我失望。