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.