我有数百个键,例如:
我有与这些密钥相关的数据,数据是一个字符串,最后有相关的密钥。
我希望使用哈希表和哈希函数来根据密钥记录数据,我希望能够从表中提取数据。
我知道使用哈希函数和哈希表,这里没有问题。
可是;
我希望给程序一个字符串作为子字符串,并检索匹配键的数据。
例如:
我必须提供“红色”并且必须能够获得
作为输出。
或
我必须提供“apple”并且必须能够获得
作为输出。
我只能考虑搜索所有密钥,如果它们有匹配的子字符串,是否还有其他解决方案?如果我搜索每个查询的所有关键字符串,那么使用散列是不必要的,没有意义,是吗?
但是,搜索子串的所有键是O(N),我希望用O(1)来解决问题。
使用散列,我可以散列键,例如“redapple”到例如 943 ,并且“maninred”到例如的 332
查询man给出字符串“red”我怎么能从 943 和 332 中发现键有“红色”子串?这不符合我的思维技能。
感谢任何建议,想法。
答案 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)
我最近研究了这个问题,并且我确信这是不可能完成的。我希望哈希表可以帮助我提高像您一样的搜索速度,但会让我失望。