如何实现最快的算法来匹配前缀与字符串?

Posted

技术标签:

【中文标题】如何实现最快的算法来匹配前缀与字符串?【英文标题】:How to implement a fastest algorithm for match the prefix with string? 【发布时间】:2019-04-18 02:01:58 【问题描述】:

大约有 100K 字符串 - 前缀,现在我们需要知道给定字符串是否与这些前缀之一匹配。例如,前缀是:

12
123
1234
12345

现在给定的字符串是 123abc,它将匹配“123”前缀; 如果给定的字符串是 12340098,它将匹配“1234”前缀。

既然有10万个前缀,所以我们需要一种非常快速的方法来匹配它,我们如何使用C++来实现呢?

【问题讨论】:

将前缀转化为确定性有限自动机结构,然后使用每个字符串执行自动机;基本上是一个状态机。有关更多信息,请参阅一本好的计算机科学算法书籍。大学四年才能获得计算机科学学位是有原因的。这是一个高级主题,无法在 stackoveflow.com 上的简短回答中完全解释 将所有前缀放入一个哈希表中,然后尝试查找给定字符串前N个字符,增加N,直到失败? 没有“最快”的内置类型,满足该要求的一种算法是 ternary search tree,它需要传统 TRIE 所需指针内存的 1/25。 @DavidC.Rankin 谢谢,看来github项目对我很好,我会学习的。 这是一个极快的前缀搜索,用于实现文本编辑器的单词补全。唯一的复杂性是在删除单词时删除重新排序的节点——类似于平衡红黑树或 AVL 树。 (虽然我花时间写它有点偏见:) 【参考方案1】:

我认为您正在寻找 trie 数据结构,该结构针对以下形式的查询进行了优化:“这些字符串中的任何一个是给定字符串的前缀吗?”或“这个给定的字符串是这些其他字符串的前缀吗?” (这与@Sam Varshavchik 在评论中提到的确定性有限自动机有关,尽管这种联系需要一点 CS 理论才能完全理解)。

有很多方法可以在 C++ 中实现 trie。我建议首先阅读数据结构以更好地了解它的工作原理,然后使用它来指导您的实施。如果在编码过程中遇到一些问题,请随时发布后续问题。

【讨论】:

这个答案可能会通过添加至少一些解释来变得更好,即使它是关于正在发生的事情的非常基本的,以防将来链接中断或其他什么。 谢谢,我试试三元搜索树

以上是关于如何实现最快的算法来匹配前缀与字符串?的主要内容,如果未能解决你的问题,请参考以下文章

字符串匹配算法的使用(未完待整理)

并行前缀和 - 最快的实现

敏感词过滤算法:前缀树算法

使用前缀树实现敏感词过滤(字符串的匹配)

使用前缀树实现敏感词过滤(字符串的匹配)

使用前缀树实现敏感词过滤(字符串的匹配)