自动建议:子串匹配

时间:2013-04-02 10:50:04

标签: java c++ data-structures

我正在尝试使用三元搜索树(TST)实现自动建议,但是当我们寻找前缀搜索时TST很有用,我们如何为子字符串匹配实现Auto Suggest? 是否有其他可以使用的数据结构?

例如子串匹配: 当我尝试使用自动建议搜索UML时,即使字符串“UML初学者指南”也应该匹配。

1 个答案:

答案 0 :(得分:1)

这是我的头脑,而不是任何适当且经过验证的数据结构/算法:

  1. 选择所有合法字符到N个符号的映射(为简单起见:拉丁字母26个符号和类似非拉丁字母忽略大小写+ 1个非字母=总共27个符号)。

    < / LI>
  2. 从词典中创建一个最大分支因子为N的浅树(即非常高)。叶子节点将包含对包含从根到该叶子的符号组合的所有单词的引用,(中间节点可能包含对叶子节点深度短的单词的引用,或者您可以忽略那些短的单词)。

  3. 树的深度是可变的,可能在1..4的范围内,因此每个叶节点将包含大约相同数量的单词(当然在许多叶子下列出的相同单词,如叶子MAT下的MATCH,如果树深度恰好是3),ATC,TCH。

  4. 当用户输入字母时,请尽可能地跟随树,直到您留下相对较少的单词集。然后在你离开树的叶子后对剩余的单词进行线性过滤,用户输入更多文本进行匹配。 (可选)过滤掉实际上不是字符匹配的符号匹配,但是当用户输入äöO等时也可以匹配ao0

  5. 优化您将字符映射到的符号数,以便为树提供良好的分支因子。优化每个叶子的单词,以获得不错的内存使用,而无需过多的单词在到达树的叶子后进行线性过滤。


  6. 当然,实际研究的算法用于在大块文本中查找字符串(用户输入的内容)(所有要匹配的短语/单词),例如Aho–CorasickRabin–Karp,这可能值得研究。