找出 2 个大数组之间的差异

Find Difference between 2 large arrays

我有两个字节数组,它们可能非常大,甚至可能有 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 = 与 array1 相同,1 = 与 arrays1 不同)

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

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

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

我需要用 C# 编写。

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

你要找的是 diff algorithm, which isn't so easy to do well. I recommend using Google's DiffMatchPatch library 而不是自己写,但如果你想走那条路,维基百科文章应该是一个很好的起点,可以了解更多关于那只兔子的信息洞.

您可以比较两个数组之间的每个元素。如果匹配,则将 0 添加到 array3 并查看两个数组中的下一个元素。如果没有匹配,则在array3中添加一个1并查看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