【发布时间】:2017-02-23 03:45:59
【问题描述】:
您将如何解决以下问题:
给定一串可以随时添加的符号和模式,计算每个模式出现的频率。
示例:
有一个连续的输入符号流让我们说 A B A C D E ...
用户可以随时注册一个新模式,例如(B A C)。如果模式在第二个时间步之前注册,则该模式应计算一次。
在重叠模式的情况下,仅应计算第一个模式,例如 (BAC) 和 (ACD) 将仅导致 (BAC)被计算。
解决方法:
简单的解决方案是每个模式只保留一个位置,当模式匹配时将其推进,并在匹配时重置所有位置。这将导致 O(n * m) 的运行时间
其中 n 是流的长度,m 是最长模式的长度(例如,在所有模式中具有长度为 m - 1 的相同前缀)。
另一种方法是构造一个有限自动机并使用模式可以具有组合前缀的事实。
但是有一些问题:
如何构造图案之间的边缘? (例如 A B 中的 B D E)
如何在运行时添加模式。例如。假设流是 A B 并且目前只有模式 (A B C) 被注册。现在用户注册(B A C)。如果流以 A C D E 继续。该模式不应匹配,因为第一个符号在注册之前出现。
这个想法可以链接到Aho Corasick algorithm。然而,该算法确实匹配所有出现的模式,而不仅仅是第一个。它不允许在运行时添加模式。
【问题讨论】:
标签: string algorithm match string-matching