LINUX/C++从第二个文件中删除第一个文件中的字符串
LINUX / C++ Remove strings in first file from the second file
我正在尝试比较两个字符串文件,并从文件2中删除文件1中的所有内容(如果存在),并将其保存在第三个输出文件中。我本来打算为此写一个c++程序,但我能想到的最好的是O(N^2),Linux中有任何命令可以做到这一点吗?如果没有,用c++做这件事最有效的方法是什么?这些文件在一个中有多达10亿个字符串,在另一个中有1000万个字符串,因此O(N^2)是效率极低的
ex f1你好乔什科里sam登
f2千斤顶乔什乔伊samnedaetc
输出文件:千斤顶乔伊nedaetc
为了明确起见,我并没有试图合并它们然后删除重复项,我只想从文件2中删除文件1中字符串的重复项。感谢
fgrep
非常方便:它将为一组固定字符串生成一个文件。
fgrep -f f1 -v f2
将打印出f2
中未在f1
中找到的所有行。
您可以使用Aho-Corasick字符串匹配算法来解决此任务。它用于跨文本的多关键字搜索,其时间复杂性是线性的。
该算法在网络上有一些C++实现。例如这个。
此外,还有一个好看的python库。
但是,我不确定在使用这些源/库时内存的复杂性是否可以。您可能需要从第一个文件中分块读取输入(因为它可能有数十亿个字符)。
您可以编写一个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等)
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 从 .lib 文件创建一个.dll文件
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 我的C++程序只写入文本文件最后一个条目
- C++:忽略第一个 cin.ignore 之后的输入
- c++ 提升如果 .extension() == " "这意味着这个文件是一个文件夹?
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 程序错误地读取了二进制文件的一个字节
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 第一个c++文件和头LNK2019错误