2010-04-10 8 views
5

Actualmente, estoy probando cada elemento entero uno contra el otro para encontrar los que coinciden. Las matrices no contienen duplicados dentro de su propio conjunto. Además, las matrices no son siempre de la misma longitud. ¿Hay algún truco para acelerar esto? Estoy haciendo esto miles de veces, por lo que está empezando a convertirse en un cuello de botella en mi programa, que está en C#.¿Cuál es la forma más rápida de encontrar el número de coincidencias entre las matrices?

+0

¿Es que simplemente desea una lista única de todos los enteros que existen en ambas matrices? – Thomas

+0

Para agregar al comentario de Thomas, ¿las matrices están ordenadas? –

+0

Esa sería otra forma de expresarlo. Una lista única común en ambos conjuntos. Sí, están ordenados. –

Respuesta

5

Utilice un HashSet

var set = new HashSet<int>(firstArray); 
set.IntersectWith(secondArray); 

El conjunto ahora contiene sólo los valores que existen en ambas matrices.

+0

Creo que quiere. Intercambiar en lugar de .Union –

+0

Ahh fart cerebro! Gracias. Lo edité – Josh

+0

Acabo de probar el HashSet con IntersectWith y es dos veces más lento en comparación con iterar sobre todos los elementos. –

6

Se podría utilizar LINQ:

var query = firstArray.Intersect(secondArray); 

O si las matrices ya están ordenados que podría iterar sobre las dos matrices de sí mismo:

int[] a = { 1, 3, 5 }; 
int[] b = { 2, 3, 4, 5 }; 

List<int> result = new List<int>(); 
int ia = 0; 
int ib = 0; 
while (ia < a.Length && ib < b.Length) 
{ 
    if (a[ia] == b[ib]) 
    { 
     result.Add(a[ia]); 
     ib++; 
     ia++; 
    } 
    else if (a[ia] < b[ib]) 
    { 
     ia++; 
    } 
    else 
    { 
     ib++; 
    } 
} 
+0

@Mark: su código supone silenciosamente que las matrices están ordenadas – Vlad

+1

John ya indicó que las matrices están ordenadas en los comentarios anteriores. –

0

Si tal comparación es un cuello de botella en su programa, quizás estés usando una estructura de datos inapropiada. La forma más simple podría ser mantener sus datos ordenados. Luego, para descubrir las entradas comunes, necesitaría atravesar ambas matrices solo una vez. Otra opción sería mantener los datos en un HashSet.

Cuestiones relacionadas