字符串查找具有最低频率字符

时间:2016-10-03 15:52:54

标签: c++ algorithm string-search

我有3个文本文件。一个带有一组要搜索的文本      (例如ABCDEAABBCCDDAABC)
一个包含许多要在文本中搜索的模式
(例如AB,EA,CC)
最后一个包含每个字符的频率
(例如:
A 4
B 4
C 4
D 3
E 1

我正在尝试编写一个算法来查找每个模式中出现频率最低的字符,并在字符串中搜索这些事件,然后检查周围的字母以查看字符串是否匹配。目前,我分别在自己的向量中有字符和频率。 (其中每个向量的i = 0将分别为A 4。

有更好的方法吗?也许更快的数据结构?此外,一旦找到最不常见的字母,有哪些有效的方法可以检查模式字符串与文本字符串的一部分?

2 个答案:

答案 0 :(得分:2)

您可以运行Aho-Corasick算法。它的复杂性(一旦预处理 - 其复杂性与文本无关 - 完成),是Θ(n + p),其中

  • n 是文本的长度

  • p 是找到的匹配总数

这基本上是最佳的。试图跳过看似频繁的字母是没有意义的:

  1. 如果字母不是匹配项的一部分,则算法需要单位时间。

  2. 如果该字母是匹配项的一部分,则该匹配包括所有字母,不论其在文本中的频率如何。

答案 1 :(得分:0)

您可以运行一个迭代循环来保持实例计数,并检查字符是否出现超过一定百分比的次数,基于搜索的总字符数和字符串的总长度。即如果你有100个字符和5种可能性,任何出现超过百分之二十的字符都可以打折,通过传递与该字符匹配的任何值来提高效率。