如何实现最快的算法来匹配前缀与字符串?
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。我建议首先阅读数据结构以更好地了解它的工作原理,然后使用它来指导您的实施。如果在编码过程中遇到一些问题,请随时发布后续问题。
【讨论】:
这个答案可能会通过添加至少一些解释来变得更好,即使它是关于正在发生的事情的非常基本的,以防将来链接中断或其他什么。 谢谢,我试试三元搜索树以上是关于如何实现最快的算法来匹配前缀与字符串?的主要内容,如果未能解决你的问题,请参考以下文章