比较两个没有一行共同点的大文件
Compare two large files not having a single line in common
我有两个大(10M行(文件,都是数据文件。每行包含多个字段,最后 3 个字段给出 x、y、z 位置 为了检查我的随机生成器,我想确保一个文件中没有一行的位置与第二个文件中的任何行相同。 我唯一想到的是类似的事情
loop over file1
read file1: eventnr1 energy1 posX1 posY1 posZ1
loop over file2
read file2: eventnr2 energy2 posX2 posY2 posZ2
if ( fabs(posX1 - posX2) < 0.00001 && fabs(posY1 - posY2) < 0.00001 etc...)
当然,这非常耗时(我尝试了 bash 脚本和C++程序,我不确定哪个会更快(。 有谁知道更聪明(更快(的方法?
需要明确的是,除了一两行之外,文件可能完全不同。 使用UNIX"diff"将不起作用(文件太大(。
此致敬意
马奇尔
- 读取两个文件的所有内容
- 对它们进行排序
- 从指向两个条目列表的第一个条目的指针开始,然后递增指向较小条目的指针,直到到达末尾
与蛮力方法O(N*N)
相比,这是O(N*logN)
(对于排序,其余部分是线性的(。
0( 如果您有足够的 RAM 将较小文件的字段保存在 RAM 中,您可以这样做。
0 a(将其存储在 HashMap 中(如果您能负担得起它的开销,并且可以使用哈希函数来哈希处理与您假设它们与相同值相同的相似数字( -> 检查成本 O(1(0 b( 在 RAM 中对文件进行排序(成本 O(n * log n( 并稍后检查成本O(log n((
遍历不在 ram 中的文件,并检查每个值是否已在 RAM 中。
这样,您只读取两个文件一次,成本为 a( O(n(, b( O(nlog n(
1( 如果无法在 RAM 中加载较小的文件: 对较小文件的每个数据块执行与 0( 中相同的操作。 这意味着您需要从一个文件中读取块(k 个块(,并为每个块迭代另一个文件。
这样,您可以读取一次较小的文件,然后再读取 k 次。成本是 a( O(k n(, b(O(k n/k log n/k + n k*log n/k(
相关文章:
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 从C++dll访问C#中的一行主要参数
- 在C++中,我如何接受不同于同一行的用户输入
- 如何从一行中读取特定数量的字符?(C++)
- 读取最后一行代码算法 - c++ 时出现问题
- 查找矩阵C++中每一列和每一行的最小和最大元素
- 有没有办法在一行中填充矢量图
- 需要将一行代码从C++ Qt翻译成PyQt
- 为什么如果我添加这一行,我的程序会不断询问值
- 如何使代码打印文本文件中的第一行?
- 如何在C++中以这种方式返回一行文本?
- 如何使用运算符在同一行中多次调用函数
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 而(!inputfile.eof())只读取第一行?
- 这段代码的最后一行在做什么?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- C++找出覆盖同一行的数组
- 比较两个没有一行共同点的大文件