使用 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++ 查找文件中的所有重复模式的主要内容,如果未能解决你的问题,请参考以下文章

使用grep和sed递归查找和替换所有文件中的字符串[重复]

使用PHP在文件名中查找带有字符串或模式的目录中的所有文件

Linux系统中查找删除重复文件,释放磁盘空间。

使用 Python 查找目录中的所有 CSV 文件

使用查找时排除文件夹[重复]

如何递归地查找具有文本模式的文件,不包括某些目录和文件[重复]