【问题标题】:Algorithm for pattern matching模式匹配算法
【发布时间】:2010-02-09 13:58:40
【问题描述】:

背景

我正在设计一个将文本从一种语言转换为另一种语言的应用程序。例如,输入文本hello 将被转换为指定语言文本。这是通过对每种语言都有一个查找表来完成的。转换算法有以下步骤。

  1. 寻找完全匹配。整个单词hello 将成为模式。如果找到任何匹配项,则停止处理并返回匹配项。
  2. 否则从左右开始并查找每个字符,直到完成所有组合。例如:迭代 1:模式 = h,第二个 - he,第三个 - hel 等等。匹配的令牌将保存在临时缓冲区中,并在没有更多匹配项时返回。这类似于最大咀嚼规则
  3. 如果找到匹配,匹配的文本将从原始文本中删除并继续处理剩余的文本。

此算法必须多次迭代输入文本并导致二次复杂度。我试图通过在树结构中安排查找表来优化这一点(非常类似于后缀树)。如果有hhello 的查找文本,则会像这样组织

root
--h
----hel
--lo

这将帮助我避免不必要的查找。匹配h 后,只有当h 节点有孩子时,我才需要转到下一个字符。这大大减少了迭代次数。

问题

  1. 这种数据结构叫什么名字?是否有适用于 C 或 C++ 的现成实现?
  2. 您认为上述算法或数据结构有什么可能的改进吗?

有什么想法吗...?

【问题讨论】:

标签: c++ c algorithm data-structures


【解决方案1】:

三元搜索树可能就是您所说的。它类似于 trie,但据我了解更节省空间。

【讨论】:

    【解决方案2】:

    查看“Trie”数据结构。

    为什么不使用 Lucene 以非常快速的方式索引文本,甚至更多 - 索引包括算法

    • 词干
    • 保险丝匹配

    等等。

    【讨论】:

    • 感谢您的建议。但是,LuceneJava 中,我正在寻找 C 或 C++ 实现。
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多