【问题标题】:An output sensitive pattern matching algorithm一种输出敏感的模式匹配算法
【发布时间】:2011-10-23 07:06:50
【问题描述】:

这是在面试的第三步问我的模式匹配问题(我认为它可能是 KMP 的输出敏感版本,不确定。也无法解决问题)。

与往常一样,我们有一个文本 T,但这次它由来自 t_1,...,t_2k 的字符组成,而 P 是来自 p1,...,pk 的模式。

它们都来自相同的字母表,符号来自 1,...,k。但并非所有符号都需要出现在文本或图案中。

如果我们知道字母符号在模式 P 中出现的次数不超过 n 次,找到一个 O(kn) 算法来构造一个长度为 k + 1 的向量 C,其中 C[i] 是 P 所在的位置数与 ti...ti+k−1 一致。

有什么想法吗?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    这要简单得多 - 看看复杂度 - O(kn) - 这意味着蛮力:

    要计算 C[i],只需同时遍历从位置 0 开始的模式和从位置 i 开始的文本并计算匹配项。还行吧)。 因此,计算整个 C 需要 n 倍,所以 O(nk)。

    【讨论】:

      【解决方案2】:

      C[i] 是 T[i + j] = P[j] 的位置数,其中 j 是沿模式的偏移量。创建它的明显方法是在文本中的每个位置重复向前扫描,将 P[j] 与 T[i + j] 匹配,但实际上您只需要考虑模式中您知道与当前匹配的位置文本字符,您可以在沿文本移动之前处理任何特定文本位置所贡献的 C[i] 的所有值,

      创建一个 HashMap,为 P 中的每个字符保存它出现的位置列表。对于文本中的每个字符,在 HashMap 中查找它,并递增 C[i - j],其中位置 j 依次是该字符在模式中出现的偏移量。

      【讨论】:

      • 假设您在文本 ABCDEFGHIJ 的最后一个字符处,并且模式是 JQQJQJ。您想要得到的答案是 0000101001,来自 GHIJ/JQQJ 之类的匹配项,要获得这个答案,您需要增加 3 个计数器以产生 1,当您看到最后的 j 时。所以在这种情况下,最后一个字符产生 3 个增量。事实上,每个字符以 m 为增量产生,其中 m 是它在模式中出现的次数。我们知道在模式中没有字符出现超过 n 次,因此总工作量为 O(kn) - 每个 k 个字符最多 n 个增量。
      猜你喜欢
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多