¿Cómo encontrar artículos en un superconjunto que no están en un subconjunto

StackOverflow https://stackoverflow.com/questions/1911646

  •  19-09-2019
  •  | 
  •  

Pregunta

Sé que hay un "no" en gracias IEnumerable en LINQ que tiene una colección de no contra, pero me preocupa gran rendimiento oh ¿Cuál es el algoritmo más rápido para hacer esto?

¿Fue útil?

Solución

La única manera de eliminar un subconjunto de objetos de un IEnumerable<T> es bucle a través del superconjunto y para cada artículo en el bucle superconjunto a través del subconjunto, la eliminación de que elemento de la superconjunto si se encuentra en el subconjunto.

Esto le dará O (N ²) en promedio.

Ahora bien, si existe información adicional sobre estas colecciones (tal vez uno o ambos es una lista o tal vez una o ambas de las secuencias se ordenan) que podrían ayudar a crear una solución con más prestaciones.

Si está interesado, aquí es un método de extensión que va a hacer lo que acabo de describir:

public static IEnumerable<T> Exclude<T>
    (this IEnumerable<T> source, IEnumerable<T> items)
{
    foreach (T t in source)
        if (!items.Contains(t))
            yield return t;
}


No importa, utilice el Enumerable.Except método de extensión:

  

la diferencia de conjuntos de dos secuencias.

Otros consejos

Si se puede iterar sobre los juegos en orden, puede garantizar O (n) el comportamiento (en lugar de la "típicamente O (n), pero posiblemente O (N ²) en el peor de los casos" que una hashset tiene) por iteración a través de a los dos al mismo paso.

Por ejemplo:

//loop boilerplate
if(itemA < itemB) {
    itemA = a.next();
    continue;
}
if(itemA > itemB) {
    itemB = b.next();
    continue;
}
a.remove(itemA);

Se tendrá que añadir la comprobación de límites y otra repetitivo mismo.

Es posible obtener un mejor rendimiento mediante la conversión del superconjunto en una tabla hash (O (n) normalmente, pero luego le permite realizar búsquedas en tiempo constante). A continuación, puede enumerar sobre el subconjunto y comprobar si existe cada elemento en el superconjunto. Toda la operación debe tomar O (n) de memoria adicional y el tiempo de O (n).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top