【问题标题】:Auto Suggest : Substring matching自动建议:子字符串匹配
【发布时间】:2013-04-02 10:50:04
【问题描述】:
我正在尝试使用三元搜索树 (TST) 实现自动建议,但是 TST 在我们寻找前缀搜索时很有用,我们如何也可以为子字符串匹配实现自动建议?
有没有其他可以使用的数据结构?
例如子字符串匹配:
当我尝试使用自动建议搜索 UML 时,即使是字符串“UML 初学者指南”也应该匹配。
【问题讨论】:
标签:
java
c++
data-structures
【解决方案1】:
这是我的想法,不是任何适当且经过验证的数据结构/算法:
-
选择所有合法字符到 N 个符号的映射(为简单起见:26 个符号用于拉丁字母和类似的非拉丁字母,忽略大小写 + 1 个用于非字母 = 总共 27 个符号)。
从您的字典中,创建一个最大分支因子为 N(即相当高)的浅树。叶节点将包含对包含从根到该叶的符号组合的所有单词的引用(中间节点可能包含对比叶节点深度短的单词的引用,或者您可以忽略那么短的单词)。
树的深度是可变的,可能在 1..4 的范围内,因此每个叶节点将包含大约相同数量的单词(当然,相同的单词列在许多叶下,例如叶 MAT 下的 MATCH, ATC, TCH 如果树的深度恰好是 3)。
当用户输入字母时,沿着树一直往前走,直到剩下相对较少的单词。然后在您处于树的叶子之后对剩余的单词进行线性过滤并且用户输入更多文本进行匹配。可以选择过滤掉实际上不是字符匹配的符号匹配,尽管当用户输入 ao0 等时匹配 äöO 可能会很好。
优化您将字符映射到的符号数量,以便为树提供良好的分支因子。优化每片叶子的单词以获得良好的内存使用率,而无需在到达树的叶子后线性过滤太多单词。
当然,有一些实际研究过的算法可以在大段文本(您想要匹配的所有短语/单词)中查找字符串(用户输入的内容),例如 Aho–Corasick 和 Rabin–Karp,这可能值得调查。