我正在尝试比较两个字符串文件并从文件2中删除文件1中的所有内容(如果存在)并将其保存在第三个输出文件中。我打算为此编写一个c ++程序,但最好能想到的是O(N ^ 2),Linux中是否有任何命令可以执行此操作?如果不是用c ++最有效的方法是什么?这些文件在一个中有多达10亿个字符串,在另一个中有1000万个字符串,所以O(N ^ 2)效率非常低
ex f1 你好 玩笑 科瑞 SAM 别
F2 插口 玩笑 乔伊 SAM NEDA 等
OUTPUTFILE: 插口 乔伊 NEDA 等
要清楚我不是试图合并它们然后删除重复项,我只想要从文件2中删除文件1中的字符串重复项。 感谢
答案 0 :(得分:3)
fgrep
对此非常方便:它会为一组固定字符串grep一个文件。
fgrep -f f1 -v f2
会打印f2
中f1
中找不到的所有行。
答案 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,....)