比较两个没有一行共同点的大文件

Compare two large files not having a single line in common

本文关键字:共同点 一行 文件 两个 比较      更新时间:2023-10-16

我有两个大(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(