Ich habe einige Objekte mit Priorität, die zusammengesetzt sind und nur teilweise geordnet sind . Ich muss die Objekte in der Reihenfolge dieser Priorität auswählen (dh jedes Mal einen minimalen Gegenstand erhalten). Aber anstatt die Bestellung willkürlich abzuschließen, wäre es mir lieber, wenn die Warteschlange so stabil wäre, dass sie, wenn es mehr als ein minimales Element gibt, das älteste zuerst zurückgeben sollte.
Gibt es eine Heap-Datenstruktur, die bei Teilbestellungen funktionieren würde? Oder eine Änderung der regulären Prioritätswarteschlange, um damit zu arbeiten? Die übliche Wahl für den Algorithmus, den ich benötige, ist einfacher Binär- oder 4-ary-Heap, aber das funktioniert nicht mit partieller Sortierung.
Die Prioritätswerte unterstützen:
- Teilbestellung mit Operation . Es ist eine teilweise Anordnung, so dass es möglich ist, dass a \ preccurlyeq b falsch ist und b \ preccurlyeq a auch falsch ist. In diesem Fall schreibe ich ein \ not \ lesseqgtr b .
- Die Suche nach infima (glb) und suprema (lub). ist das maximale so dass . Die Berechnung des Infimums von Werten benötigt Zeit. Es gibt ein Infimum (und ein Supremum) jeder Menge.
- Eine lineare Erweiterung für die Teilbestellung könnte definiert werden. Die Verwendung für die Prioritätswarteschlange ist der einfache Ausweg, da der Algorithmus auf diese Weise funktioniert. Die Reihenfolge wirkt sich jedoch auf die Leistung aus, und die Reihenfolge des Einfügens sollte zur Vermeidung von Worst-Cases am besten sein.
Zusätzlich muss der Algorithmus, in dem ich dies verwenden möchte, das Minimum aller Prioritäten in der Warteschlange kennen.
Die Prioritäten haben eine reale Bedeutung, können sich jedoch ändern, sodass es nicht sinnvoll erscheint, sich auf andere Eigenschaften zu verlassen, die sie haben könnten.
Hinweis: Binäre Heaps funktionieren nicht bei Teilbestellungen. Nehmen Sie einen binären Heap mit , und , wobei und und . Sie sind also in dieser Reihenfolge positioniert
a (0)
/ \
b (1) c (2)
Jetzt wird d eingefügt. Die nächste freie Position ist 3, das linke Kind von , also bekommen wir
a (0)
/ \
b (1) c (2)
/
d (3)
Wenn (was aus der Transitivität impliziert , aber nichts über und ) und , dann wird nicht mit getauscht , weil es nicht weniger ist. Aber es ist tatsächlich weniger als , aber es wird nicht damit verglichen, so dass jetzt die Haupthaufeninvariante nicht gilt; Top ist nicht minimal.
Ich vermute, dass ein Wald von Haufen, der dem Binomialhaufen ähnelt, zum Arbeiten gebracht werden könnte. Grundsätzlich ist es wichtig, immer neue Werte mit root zu vergleichen und nur vergleichbare Elemente miteinander zu verknüpfen. Es würde die Bäume im Wald zufällig dimensionieren und somit die Komplexität von der Anzahl der miteinander unvergleichbaren Mengen im Haufen abhängig machen. Ich vermute, dass die Komplexität nicht behoben werden kann (wir müssen weiter vergleichen, bis wir auf ein vergleichbares Element treffen). Vielleicht habe ich etwas verpasst, also lasse ich dies offen.
Hinweis: Die Reihenfolge ist unvollständig, und obwohl es Möglichkeiten gibt, eine lineare Erweiterung dafür zu definieren, gehört das Hinzufügen eines Zeitstempels und die Verwendung als sekundäres Kriterium nicht dazu. Angenommen, wir haben den Zeitstempel für jedes zugewiesen und die Reihenfolge als iff oder ( und . Dann nehmen wir an, wir haben verschiedene , , , so dass und . Dann und , aber , so ist die Beziehung nicht transitiv und daher überhaupt keine Ordnung. Diese Art der Erweiterung funktioniert nur bei schwachen, aber nicht bei partiellen Ordnungen.
Bearbeiten: Ich habe festgestellt, dass nicht nur das Infimum einer Gruppe definiert ist, sondern dass ich auch in der Lage sein muss, das Infimum der Elemente, die sich derzeit in der Warteschlange befinden, effizient abzurufen. Ich überlege nun, ob das Hinzufügen spezieller Knoten, die Infima von Teilbäumen enthalten, zu einer allgemeinen Heap-Struktur hilfreich wäre.
quelle
Antworten:
Obwohl das genaue Problem, das in der ursprünglichen Frage aufgeworfen wurde, schwierig zu sein scheint (und ich an einer Lösung für dieses Problem interessiert wäre, insbesondere für den infima-Findeteil). Ich wollte nur festhalten, dass, wenn die teilweise bestellte Menge tatsächlich aus Vektoren besteht, die eine Produktbestellung verwenden, und wenn es ausreicht, nur die Garantie zu haben, dass die Prioritätswarteschlange die Werte in einer Reihenfolge zurückgibt, die mit der teilweisen Bestellung "kompatibel" ist ( Das heißt, kleinere Elemente werden immer vor größeren Elementen zurückgegeben.
Die Idee besteht im Wesentlichen darin, eine topologische Anordnung der teilweise geordneten Menge zu finden. Das heißt, eine Gesamtreihenfolge ' ', so dass . Für Vektoren, die eine Produktreihenfolge verwenden, ist dies ziemlich einfach: Verwenden Sie einfach eine lexikografische Reihenfolge ' ', wobei die erste "Komponente" die Summe aller für die Produktreihenfolge verwendeten Komponenten ist (der Rest der Komponenten ist im Wesentlichen willkürlich). Sie können sich also auch an eine schwache Reihenfolge halten. Wir können dann sehen, dass und≤T a≤b⟹a≤Tb ≤S
quelle
Was ist falsch daran, Ihre Teilbestellung abzuschließen?
Wenn Sie "älteste zuerst" bevorzugen, ist Ihre Bestellung effektiv abgeschlossen. "unvergleichliche" Gegenstände sind nach Alter vergleichbar.
Fügen Sie jedem Element einen Zeitstempel (oder eine andere monoton wachsende Ganzzahl) hinzu und verwenden Sie ihn, wenn ein "echter" Vergleich nicht möglich ist.
quelle
EDIT: Dies scheint ein interessantes Problem zu sein, und ich hatte ein wenig Nachforschungen darüber. Ich schlage vor, dass Sie Folgendes lesen:
Ich schlage vor, Sie lesen dieses Papier: Daskalakis, Constantinos, et al. "Sortieren und Selektieren in Posets." SIAM Journal on Computing 40.3 (2011): 597-622.
Die Autoren präsentieren hier eine Datenstruktur namens ChainMerge, die ein Poset und eine Kettenzerlegung des Posets in Ketten akzeptiert . Die Größe der Datenstruktur ist . Die Autoren präsentieren einen Algorithmus zum Finden der Minima, die in wobei eine Obergrenze für die Breite des Posets ist. ..Ich dachte vielleicht ist das interessant.q O(nq) O(wn) w
Hinweis: Ich habe eine vorherige naive Antwort gelöscht. Bitte klicken Sie auf Bearbeiten, um es zu sehen.
quelle
Meine Terminologie ist möglicherweise falsch. Bitte bearbeite meine Antwort direkt, um alle Probleme zu beheben, die du findest.
Zunächst müssen nicht miteinander vergleichbare Mengen an den Eingaben ermittelt werden.
Zum Beispiel kann es 5 Objekte geben,
a, b, c, d, e
aber ihre teilweise Anordnung bildet zwei getrennte Graphen:a ≤ b ≤ c
d ≤ e
{a, b, c}
ist unvergleichlich mit einem von{d, e}
.Diese nicht miteinander vergleichbaren Mengen müssen zuerst erkannt werden, bevor die Objekte in einer geeigneten Datenstruktur gespeichert werden können. Dies kann mit einem Union-Suchalgorithmus erfolgen
Für die Effizienz muss das Einfügen eines neuen Objekts eine effiziente Methode zum Auffinden "der Liste vorhandener Objekte, die mit diesem neuen Objekt vergleichbar sind" aufweisen.
Nun innerhalb jeder Teilmenge (bzw.
{a, b, c}
und{d, e}
) sollte die Minima werden gut definiert. (Für jede Untergruppe kann es aufgrund einer Teilordnung ein oder mehrere Minima geben.)Ich sehe dies als gerichteten azyklischen Graphen . Der Versuch, ihn in einen Haufen zu stecken, scheint katastrophal.
Um die Minima aus dieser zusammengesetzten Datenstruktur zu extrahieren, müssen Sie im nächsten Schritt die Liste aller Minima aus allen Teilmengen abrufen, das mit dem frühesten Zeitstempel auswählen und dieses Objekt entfernen und zurückgeben.
quelle
Ein Projekt, an dem ich arbeite, weist ein ähnliches Problem auf (nebenbei verwende ich auch die Teilreihenfolge von Vektoren). Wir hatten bereits einen quadratischen Zeitalgorithmus zum Sortieren einer zufällig sortierten Liste, und ich entwickelte einen Einfügealgorithmus, indem ich sein Verhalten beobachtete, wenn nur ein Objekt außer Betrieb war. Wir wissen nicht, ob dies die schnellste mögliche Implementierung ist.
Hier ist ein Pseudocode.
quelle
Das übliche Heap-Verhalten besteht darin, den neuen Wert an die Rückseite anzuhängen und dann zu sichten, während der Vergleich größer als der übergeordnete Wert ist.
Wenn Sie einen Vergleich schreiben, der für Eltern und Kind den gleichen Wert zurückgibt, sind nicht vergleichbare Fälle wie für Eltern, die größer als Kind sind , sollte das Sichten immer noch am richtigen Punkt enden.
Gilt das als ausreichend stabile Bestellung für Ihre Zwecke?
Nehmen Sie zur Verdeutlichung das Beispiel aus Ihrem Kommentar: a> b , und c ist nicht vergleichbar mit a oder b :
Das Ergebnis hängt also von der Reihenfolge der Einfügung ab. Dies scheint mit Ihrer Anfrage übereinzustimmen, aber ich bin mir nicht sicher, ob es wirklich das ist, was Sie wollen. Wenn nicht, könnten Sie das erhoffte Ergebnis anzeigen?
OK, ausgehend von Ihrem Kommentar (und der Bearbeitung Ihrer Frage) möchten Sie, dass "vergleichbare" Elemente "nicht vergleichbare" Elemente überspringen und unter der Bestellung den richtigen Platz finden, falls es einen gibt. Ich habe danach gefragt, weil ich mir nicht sicher war, wie ich das interpretieren soll
(d und b sind in deiner Bearbeitung paarweise nicht vergleichbar , aber du willst sie nicht in der Reihenfolge, in der sie eingefügt wurden).
Meine nächste Frage wäre über die Beziehung zwischen den "vergleichbaren" und "nicht vergleichbaren" Elementen gewesen, aber ich sehe, dass Sie jetzt enthüllt haben, dass es sich um Vektoren in der Produktreihenfolge handelt (es war nicht klar, ob einige Elemente paarweise sind). unvergleichbar mit allem , wie NaN oder was).
Wenn ich also Ihr neues Beispiel nehme und Vektorwerte zuordne, ist es richtig, dass dies ein Beispiel ist, in dem b mit nichts anderem vergleichbar ist:
und es sollte so sortieren:
?
quelle