查找两个数组中差异索引的最快方法

时间:2017-03-08 22:16:46

标签: c# arrays linq

我需要找到2个未排序的字节数组之间的差异。这些数组的大小相当不错,大约有300万个元素。

数组中的值将重复,因此我无法对其进行排序。

这些数组的长度相同。我只需要差异的索引。

我是否必须使用for循环遍历每个数组元素?

有更好的方法吗?

我目前使用for循环遍历每个元素,但我觉得必须有更好的方法。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

如果最快的方式是你的最终目标,那么for循环听起来就像是实现这一目标最直接的方式:

public static List<int> GetDifferentIndexes(byte[] arr1, byte[] arr2)
{
   // List to hold indexes of differences
   List<int> lstDiffs = new List<int>();

   // Assure neither array is null and lengths match
   if (arr1?.Length == arr2?.Length)
   {  
      // Loop through both arrays and check each value
      for (int idx = 0; idx < arr1.Length; idx++)
      {
         if (arr1[idx] != arr2[idx])
         {
            // Add index to list since values do not match
            lstDiffs.Add(idx);
         }
      }    
   }

   // Your list of different indexes
   return (lstDiffs);
}

答案 1 :(得分:3)

我想用LINQ来做这件事。我用了三遍来实现结果

  1. 拉链并检查是否相等。
  2. 如果不相等则编码索引,否则为-1
  3. 过滤非-1
  4. 值的结果

    以下是您可以尝试的代码:

    public static int[] GetIndexOfDifferences<T>(T[] array1, T[] array2) where T : IEquatable<T>
    {
        var diff_check = array1.Zip(array2, (x, y) => x.Equals(y));
        var get_index = Enumerable.Range(0, array1.Length).Zip(diff_check, (i, z) => z ? -1 : i);
        return get_index.Where((i) => i>=0).ToArray();
    }
    static void Main(string[] args)
    {
        var a = new[] { 1, 1, 1, 2, 2, 3, 5, 5, 6, 3, 3, 2, 2 };
        var b = new[] { 1, 1, 2, 2, 3, 3, 3, 4, 6, 5, 4, 3, 2 };
        // equals?      Y  Y  N  Y  N  Y  N  N  Y  N  N  N  Y
        // index:       0  1  2  3  4  5  6  7  8  9 10 11 12
        // expected result = { 2, 4, 6, 7, 9, 10, 11 }
    
        var result = GetIndexOfDifferences(a, b); // check
    }
    

答案 2 :(得分:0)

这可以简单地使用交叉/排除来完成,这种情况更适合您。看一下这个例子(两个数组都有数字5和7,其他元素不同)。

int[] arrayA = { 2, 5, 7, 8, 10 }; 
int[] arrayB = { 1, 3, 5, 7, 9 };

//this will contain all elements that are in both arrays
var sameElements = arrayA.Intersect(arrayB);
//elements that are in array A, but not in array B
var exceptElements = arrayA.Except(arrayB);
//elements from array A and array B but not in both
var nonintersect = arrayA.Except(arrayB).Union(arrayB.Except(arrayA));
编辑:由于OP要求索引(并且我没有仔细阅读),这可以通过(几乎)单行程轻松实现:

//data - arrays are same on all elements except third and last one (indexes 2 and 4).
int[] arrayA = { 1, 3, 6, 7, 8 };
int[] arrayB = { 1, 3, 5, 7, 9 };

List<int> listA = arrayA.ToList();
var differentIndexes = listA.Where(a => a != arrayB[listA.IndexOf(a)]).Select(a => listA.IndexOf(a));