LINUX / C ++从第二个文件中删除第一个文件中的字符串

时间:2013-11-26 20:13:18

标签: c++ linux algorithm

我正在尝试比较两个字符串文件并从文件2中删除文件1中的所有内容(如果存在)并将其保存在第三个输出文件中。我打算为此编写一个c ++程序,但最好能想到的是O(N ^ 2),Linux中是否有任何命令可以执行此操作?如果不是用c ++最有效的方法是什么?这些文件在一个中有多达10亿个字符串,在另一个中有1000万个字符串,所以O(N ^ 2)效率非常低

ex f1 你好 玩笑 科瑞 SAM 别

F2 插口 玩笑 乔伊 SAM NEDA 等

OUTPUTFILE: 插口 乔伊 NEDA 等

要清楚我不是试图合并它们然后删除重复项,我只想要从文件2中删除文件1中的字符串重复项。 感谢

3 个答案:

答案 0 :(得分:3)

fgrep对此非常方便:它会为一组固定字符串grep一个文件。

fgrep -f f1 -v f2会打印f2f1中找不到的所有行。

答案 1 :(得分:1)

您可以使用Aho-Corasick字符串匹配算法来解决此任务。它用于跨文本的多关键字搜索,它的时间复杂度是线性的。

这个算法在网上有一些C ++实现。例如this

此外,还有一个漂亮的python library

但是,我不确定使用这些源/库时内存复杂性是否正常。您可能必须以块的形式读取第一个文件的输入(因为它可能有数十亿个字符)。

答案 2 :(得分:0)

您可以编写C ++(或Ocaml)程序,该程序读取第一个文件的所有单词并将它们存储在一组字符串中(在C ++中使用std::set<std::string>,或在Ocaml中使用module SS = Set.Make(String);;)。填充该集应该是 O(n log n)复杂度(其中 n 是单词的数量,即集合的基数)。测试每个单词属于(或不属于)的 m 单词的文件是 O(m log n)

集合实现为具有对数成员资格测试时间的平衡树。

但是,您可能应该使用一些数据库系统来存储(和填充)数据。 (例如PostGreSQL,MariaDB,MongoDB,CouchDB,....)