So finden Sie Elemente in einem Superset, die sich nicht in einer Untergruppe befinden

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

  •  19-09-2019
  •  | 
  •  

Frage

Ich weiß, dass es ein "nicht" auf iEnumerable dank Linq gibt, das eine Sammlung nicht dagegen benötigt, aber ich mache mir Sorgen um die Big Oh Performance. Was ist der schnellste Algorithmus, um dies zu tun?

War es hilfreich?

Lösung

Die einzige Möglichkeit, eine Untergruppe von Elementen aus einem zu entfernen IEnumerable<T> ist durch die Superset und für jedes Element in der Superset -Schleife durch die Teilmenge zu schleifen und dieses Element aus dem Superset zu entfernen, wenn es in der Teilmenge gefunden wird.

Das wird dir geben O (n²) im Durchschnitt.

Wenn nun zusätzliche Informationen zu diesen Sammlungen vorhanden sind (möglicherweise eine oder beide eine Liste oder eine oder beide Sequenzen sind sortiert), könnten Sie helfen, eine leistungsfähigere Lösung zu erstellen.

Wenn Sie interessiert sind, finden Sie hier eine Erweiterungsmethode, die das tut, was ich gerade beschrieben habe:

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;
}


Egal, benutze das Enumerable.Except Erweiterungsmethode:

Erzeugt den festgelegten Unterschied zweier Sequenzen.

Andere Tipps

Wenn Sie die Sets in der Reihenfolge iterieren können, können Sie das Verhalten (nicht das "typisch o (n) O (n²) im schlimmsten Fall", das ein Hashset hat), garantieren, indem Sie sie beide in durchführen. Lockstep.

Zum Beispiel:

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

Sie müssen selbst eine Grenzüberprüfung und andere Kesselplatten hinzufügen.

Sie können eine bessere Leistung erzielen, indem Sie das Superset in ein Hashtable (O (n) typischerweise konvertieren, ermöglicht es Ihnen dann, nach Suchfestern in konstanter Zeit zu suchen). Anschließend können Sie über die Teilmenge aufgezählt und prüfen, ob jedes Element im Superset vorhanden ist. Die gesamte Operation sollte O (n) zusätzliche Speicher und O (n) Zeit benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top