使用 C++ 查找文件中的所有重复模式
Posted
技术标签:
【中文标题】使用 C++ 查找文件中的所有重复模式【英文标题】:finding all repeating patterns in a file using C++ 【发布时间】:2012-06-19 11:11:50 【问题描述】:我正在寻找一种方法来查找输入文件中包含至少 3 个字符的所有重复序列,然后打印出最常见的序列!它似乎需要大量的字符串处理和对输入文件的密集搜索,特别是因为要查找的模式的最大大小没有上限!
是否有任何有效的算法可以以尽可能少的处理和混乱来做到这一点? 我应该使用 string.h 还是使用 char 数组会更好? 关于如何开始的任何提示/有用的 sn-ps 等?
tnx
【问题讨论】:
你需要找到所有的还是最频繁的? 你能给出预期的文件和输出吗 如果文件很小,你可以将它全部加载到内存中,这样你就不用多次读取它了。你也可以研究suffix trees? 这确实可以方便地在代码库中发现违反 DRY 原则的行为:] 你喜欢更长的序列吗?因为任何常见的 5 个字符序列 (abcde) 总是至少需要 4 个字符序列 (abcd, bcde) 和 3 个字符序列 (abc, bcd, cde),所以较长的序列总是比较长的序列具有较低的频率序列。 【参考方案1】:我建议您从文件中创建一个后缀树。这将具有相对于文件大小的线性复杂性,并将解决问题。您可以稍微修改算法以存储字符串与字符串本身相分离的次数。这是great post 解释如何创建后缀树。
【讨论】:
这个方法还允许你找到更长的序列,给定一些启发式的偏好;通过在树中查找节点的子节点,您可以查看大多数 abc 实例是否在 abcd 字符串中,这些在 abcdefg 等中。【参考方案2】:如果您意识到最频繁的序列是 4 个字符长,那么找到最频繁的序列非常容易。可以在O(n)
时间完成,其中n
是输入文件的大小。
您可以构建一个std::map<string,int>
,逐个字符地迭代,一次获取 4 个字符的序列,并使用映射中的相应键递增值。
【讨论】:
问题说明字符串的长度是无限的。如果您无法确定字符串的长度,那么此方法将不起作用。此外,您需要为文件中的每个字符在地图中添加 4 个字符。 @jlunavtgrad 如果您只是在寻找最常见的,那没关系。最常见的子字符串长度为 4 个字符。以上是关于使用 C++ 查找文件中的所有重复模式的主要内容,如果未能解决你的问题,请参考以下文章