Effizienter Algorithmus, um die maximalen Elemente einer partiell geordneten Menge zu finden

8

Ich habe eine teilweise geordnete Menge, sagen wir A = [x1, x2, ...] , was bedeutet, dass für jede xi und xj in der Menge (genau) eine von vier Möglichkeiten zutrifft: xi < xj , xi == xj , xi > xj , oder xi und xj sind unvergleichbar.

Ich möchte die maximalen Elemente finden (d. h. jene Elemente xi , für die es keine Elemente xj mit xi < xj gibt). Was ist ein effizienter Algorithmus, um dies zu tun (die Anzahl der Vergleiche minimieren)? Ich habe versucht, eine DAG zu erstellen und eine topologische Sortierung durchzuführen, aber das Erstellen des Graphen erfordert O (n ^ 2) Vergleiche, was zu viele ist.

Ich mache das in Python, aber wenn Sie es nicht wissen, kann ich andere Sprachen oder Pseudocode lesen.

    
asmeurer 04.02.2014, 18:38
quelle

4 Antworten

4

Es scheint, dass der schlimmste Fall O (n ^ 2) ist, egal was du tust. Zum Beispiel, wenn keine Elemente vergleichbar sind, dann müssen Sie jedes Element mit jedem anderen Element vergleichen, um zu bestimmen, dass sie alle maximal sind.

Und wenn Sie O (n ^ 2) erlauben, können Sie, da die Reihenfolge transitiv ist, nur einen Durchlauf durch die Menge machen und eine Liste aller Elemente behalten, die bisher maximal sind; Jedes neue Element klopft alle maximalen Elemente aus, die & lt; es und wird zu der maximalen Liste hinzugefügt, wenn es nicht & lt; jedes maximale Element.

    
Russell Zahniser 04.02.2014, 18:50
quelle
2

Im schlimmsten Fall können Sie nicht schneller als O (n ^ 2) sein. In der Tat, um zu überprüfen, dass alle Elemente für die Pose maximal sind, in der kein Element vergleichbar ist, müssen Sie jedes Paar Elemente vergleichen. Im schlimmsten Fall ist es also eindeutig quadratisch.

    
hivert 04.02.2014 18:52
quelle
1

Angenommen, Sie haben sich alle (n wähle 2) Vergleiche angesehen, mit Ausnahme von einem, zwischen x i und x j , i! = j. In einigen Szenarien sind die einzigen zwei Kandidaten für das Maximum genau diese zwei, x und x .

Wenn Sie x i und x j nicht vergleichen, können Sie nicht definitiv sagen, ob sie beide maximal sind oder ob nur einer von ihnen ist.

Daher müssen Sie alle möglichen (n wähle 2) (O (n 2 )) Vergleiche überprüfen.

Beachten Sie, dass Ihre teilweise geordnete Menge mit einer schwarzen Box angegeben wird, die einen Vergleich durchführt. Wenn die partiell geordnete Menge zu Beginn mit einer Grafik versehen ist, können Sie anschließend die Menge der maximalen Elemente in der Zeit unterhalb von O (n 2 ) finden.

    
Timothy Shields 04.02.2014 19:08
quelle
0

Wie andere Antworten gezeigt haben, ist die Worst-Case-Komplexität O (n ^ 2).

Es gibt jedoch Heuristiken, die in der Praxis viel helfen können. Zum Beispiel, wenn die Menge A eine Teilmenge von Z ^ 2 (Integer-Paare) ist, dann können wir viele Punkte im Voraus eliminieren durch:

  1. Sortierung entlang der x-Achse (für einen gegebenen x-Wert, zB 1, finde den Punkt mit maximalem y-Wert, wiederhole für alle x-Werte), um eine Kandidatenmenge von zu erhalten Maxima, nenne es y-maximals.
  2. Genauso erhalten Sie die Menge x-maximals.
  3. Schnittmenge, um den endgültigen Kandidatensatz xy-maximals zu erhalten.

Dies ist von Kosten O (n). Es ist leicht zu sehen, dass jeder maximale Punkt in xy-Maximalen vorhanden ist. Es kann jedoch nicht maximale Punkte enthalten. Betrachten Sie zum Beispiel die Menge {(1,0), (0,1), (2,2)}.

Je nach Situation kann dies eine Heuristik sein, die gut genug ist. Sie können dies mit dem erschöpfenden Algorithmus auf der kleineren Menge xy-maximals verfolgen.

Allgemeiner wird dieses Problem als "Pareto Frontier" Berechnungsproblem bezeichnet. Hier sind gute Referenzen:

Ссылка

Ссылка

Insbesondere der BEST-Algorithmus aus der ersten Referenz ist sehr nützlich.

    
akshan 06.01.2018 10:57
quelle

Tags und Links