找出 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
我有两个字节数组,它们可能非常大,甚至可能有 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