查找 2 个大型数组之间的差异

Posted

技术标签:

【中文标题】查找 2 个大型数组之间的差异【英文标题】:Find Difference between 2 large arrays 【发布时间】:2022-01-04 20:37:42 【问题描述】:

我有两个字节数组,它们可能非常大,甚至可能有 700500 个值。

array2总是大于array1,基本和array1中的数据一样,只是随机添加,例如:

int[] array1 = 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 0, 0, 0;

int[] array2 = 1, 1, 1, 2, 7, 7, 2, 2, 2, 2, 1, 2, 3, 2, 2, 3, 3, 4, 7, 2, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 4, 1, 1, 7, 7, 8, 8, 9, 9, 0, 0;

我需要一个array3,它需要与arrays2 具有相同的大小。它将显示添加的确切索引,因此对于此示例,它将是:

int[] array3 = 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0;

(0 = 与数组 1 相同,1 = 与数组 1 不同)

我希望获得与“Beyond Compare”应用程序中相同的结果:

https://i.ibb.co/yX6YCsp/Diff.jpg

但要获取您在图片中看到的红色标记的索引,位于右侧窗格中。

我需要用 C# 编写它。

非常感谢您对此的任何帮助。

【问题讨论】:

在某些情况下可能会模棱两可,例如:array1 = 2, array2 = 22 array3 = 01 OR array3 = 10 我希望得到尽可能接近 Beyond Compare 应用程序的结果。 它显示了 array3 = 01 作为你的例子。 我不希望有人为你解决这个问题。在您的示例中,至少有 30 个左右的正确答案,可能更多。仅举几例:array3 = 000111000011100000110000000000111100000000array3 = 000011010011100000110000000000111100000000array3 = 000011001011100000110000000000111100000000。尝试解决问题,遇到困难时再回到这里提出问题 @Erik McKelvey 我已经被卡住了...... Beyond Compare 应用程序知道如何解决这个问题,正如您在我链接的图片中看到的那样......所以我正在寻找一种算法会做同样的事情,我不知道怎么做。 【参考方案1】:

您可以比较两个数组之间的每个元素。如果匹配,则将 0 添加到 array3 并查看两个数组中的下一个元素。如果没有匹配,则将1 添加到array3 并查看array2 中的下一个元素。如果array1 没有更多元素,则继续添加1 直到array2 没有更多元素。

int[] array1 = 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 0, 0, 0;
int[] array2 = 1, 1, 1, 2, 7, 7, 2, 2, 2, 2, 1, 2, 3, 2, 2, 3, 3, 4, 7, 2, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 4, 1, 1, 7, 7, 8, 8, 9, 9, 0, 0;

int index1 = 0;
int index2 = 0;

int[] array3 = new int[array2.Length];
while (index2 < array2.Length)

    if (index1 >= array1.Length)
    
        array3[index2] = 1;
        index2 += 1;
    
    else if (array1[index1] == array2[index2])
    
        array3[index2] = 0;
        index1 += 1;
        index2 += 1;
    
    else
    
        array3[index2] = 1;
        index2 += 1;
    

foreach (int i in array3)

    Console.Write(i.ToString() + " ");

输出:

0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0

【讨论】:

非常感谢,非常感谢。我会在我的数据上尝试一下,我会告诉你的。可能需要几天时间。我已经看到它给我的结果与 Beyond Compare 不同,但也许我可以将其用作基础。 @JohnB 如果您觉得有帮助,请接受我的回答 我会接受你的回答,虽然我没有时间测试它,但我找到了一个几乎完美的解决方案。我将数组保存为二进制文件,然后使用 Beyond Compare 应用程序对它们进行比较。进行比较后,我将其保存为 html 文件(在 Beyond Compare 菜单中:Session ---> Hex Compare Report...),然后我使用我编写的一个小型 C# 应用程序来提取数据以及从 HTML 文件中添加的内容,因为它的格式很容易理解。所以基本上我正在使用 Beyond Compare 为我做比较:-)【参考方案2】:

您正在寻找的是diff algorithm,这并不容易做好。我建议使用Google's DiffMatchPatch library 而不是自己编写,但如果你想走这条路,***文章应该是了解更多关于那个特定兔子洞的一个很好的起点。

【讨论】:

我不坚持自己写函数,如果有现成的函数可以做到这一点,我会很乐意使用它!我感兴趣的只是结果! 我如何在 C# 中使用这个 Google 的 DiffMatchPatch 库来给我 array3,就像我的例子一样? 如何下载这个库以及如何将它连接到我的应用程序? 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 @JohnB 我找到了一个几乎完美满足我需要的解决方案。我将数组保存为二进制文件,然后使用 Beyond Compare 应用程序对它们进行比较。进行比较后,我将其保存为 HTML 文件(在 Beyond Compare 菜单中:Session ---> Hex Compare Report...),然后我使用我编写的一个小型 C# 应用程序来提取数据以及从 HTML 文件中添加的内容,因为它的格式很容易理解。所以基本上我正在使用 Beyond Compare 为我做比较:-)

以上是关于查找 2 个大型数组之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

awk 查找两个文件中第二个字段之间的差异

查找两个大型数据集之间的最近坐标

在数组中查找具有最小差异和连续元素的 2 个子集

查找 .mat 文件之间的所有差异

在 PLSQL 中查找 dbms_utility.lname_array 类型的 2 个数组之间的差异

如何在查找2个列表的差异时维护输出列表的顺序