Soft Heaps Allgemein: Soft Heaps sind Prioritätswarteschlangen. Sie unterstützen folgende Operationen: Create (S) erzeugt einen leeren Soft Heap Insert (S,x) fügt x in den Soft Heap S ein Meld (S, S’) verschmelzt die Soft Heaps S und S’ miteinander Delete (S, x) löscht Element x aus dem Soft Heap S Findmin(S) gibt das Element mit dem kleinsten Schlüssel zurück Theorem 1.1: Starte ohne alte Daten und betrachte einige gemischte Operationen, von denen aber n Insert Operationen sind. Für alle є mit 0 < є <1/2 unterstützt ein Soft Heap mit Fehlerrate є jede Operation in konstanter Laufzeit (amortisiert), außer Insert, was O(log (1/є)) Zeit benötigt. Die Datenstruktur hat nie mehr als єn verfälschte Elemente. In einem vergleichsbasierenden Modell ist diese Schranke optimal. Bemerkung: Soft Heaps haben implizit Median-Finden Strukturen. Setze є auf eine kleine Konstante und füge n Elemente ein und führe danach [n/2] Findmin Operationen durch und lösche das minimale Element. Dazu benötigt man O (n) Zeit. Unter den gelöschten Schlüsseln ist der größte (originale) Schlüssel єn weit weg vom Median der n original Schlüssel. Um solche Ergebnisse zu erhalten, braucht man typischerweise eine Variante des Median-Finde Algorithmus von Blum. Bemerkung: Betrachte eine Sequenz von n „Insert“ Operationen in fallender Reihenfolge, durchmischt mit n „Findmins“ und є = ½. Trotz der hohen Fehlerrate liefern die „Findmins“ die aktuellen Minimums in der halben Zeit zurück. Der Grund dafür ist, dass höchstens n/2 der eingefügten Schlüssel verfälscht wurden. Wegen der fallenden Reihenfolge der Einfügens, müssen die echten Schlüssel nach ihrem Einfügen von „Findmin“ gefunden werden, falls sie zu diesem Zeitpunkt Minimum sind. Theorem 2.1: Für jedes 0<є< ½ kann man Soft Heaps nutzen zum Näherungssortieren von n Zahlen in O(n log (1/є)) Zeit. Das bedeutet, dass die Stelle jeder Nummer in der Ausgabe um maximal єn von ihrer richtigen Stelle entfernt ist. 3. Die Datenstruktur: Als Vorbetrachtung schauen wir uns Binomialbäume vom Rang k an. Die haben 2k Knoten. Ein Soft Heap ist eine Sequenz von modifizierten Binomialbäumen mit unterschiedlichen Rängen, genannt Soft Schlangen. Modifikationen: 1. Eine Soft Schlange q ist ein Binomialbaum, bei dem Unterbäume fehlen können. Der Binomialbaum, von dem q stammt heißt „Masterbaum“. Der Rang eines Knotens von q ist die Anzahl der Kinder, des dazugehörigen Knotens im „Masterbaum“. Ranginvariante: Anzahl der Kinder der Wurzel ≥ [rang(Wurzel)/2] (abgerundet) 2. Ein Blatt v speichert mehrere Elemente, faktisch eine Elemente-Liste. Der ckey von v bestimmt die Werte aller möglichen Schlüssel von Elementen aus der Elemente-Liste. Es ist eine obere Schranke der original Schlüssel. Die Soft Schlangen sind heap-geordnet nach den ckeys. Und wir definieren einen Integerparameter r= r(ε) und vereinbaren, dass alle verfälschten Schlüssel in einem Knoten vom Rang >r gespeichert werden. Implementation: Ein Knoten hat (vom Rang d)zwei Zeiger. Einen Zeiger NEXT und einen Zeiger CHILD. Die sind entweder beide NULL oder aber, der Knoten ist Vater einer Soft Schlange vom Rang d-1 (darauf verweist CHILD) und ist Wurzel einer Soft Schlange vom Rank d-1 (darauf verweist NEXT). Dann implementieren wir eine Kopfliste h1...hn. Diese Kopfliste ist eine doppeltverkettete Liste. Jeder Kopf hi hat zwei Zeiger. Einer zeigt auf die Wurzel ri einer Soft Schlange und der andere zeigt auf die Wurzel mit dem kleinsten ckey aller rj’s (mit j ≥ i, genannt Suffix_Min Zeiger). Es ist klar, dass rang(r1)<...<rang(rn). Der Rang einer Schlange ist abhängig vom Rang der Wurzel und dieser Rang wird zusätzlich h gespeichert. Verschmelzen einer Schlange vom Rang k mit einem Heap S: Suche in S den kleinsten Index i, so dass rang (ri) ≥ k 1. Fall: Rang (ri) > k Füge den Kopf rechts von hi für hi ein. (hi= hi+1) 2. Fall: Rang (ri) = k Verschmelze die beiden Schlangen zu einer Schlange vom Rang k+1, indem die Wurzel mit dem größeren ckey Kind der anderen Wurzel wird. Falls Rang (ri+1)= k+1, dann verschmelze die beiden Schlangen. Setze das fort, bis kein Konflikt mehr da ist. 4.3 „Deletemin“: Der Suffix_Min Zeiger am Anfang der Kopfliste zeigt auf das h mit dem kleinste Element. Das Problem ist, dass die Elemente-Liste dieses Knotens leer sein kann. In diesem Fall muss die Elemente-Liste gefüllt werden, mit Elementen die tiefer in der Schlange sind, auf den h zeigt. Dafür nutzen wir die Funktion „sift“, welche die leere Elemente-Liste durch eine andere ersetzt. Falls nötig machen wir diesen Prozess so lange, bis die Elemente-Liste der Wurzel nicht leer ist. „Sift“ ist das Herz der Soft Heaps. Als Argument wird der Knoten v genommen und die „sift“ Funktion lässt die Elemente den Baum Richtung Wurzel hochgehen. Typischer Weise ist bei solchen Sachen nur ein einzelner rekursiver Aufruf in der Prozedur und der berechnete Baum ist ein Pfad. Der Trick ist, dass die Rekursion gelegentlich zweimal aufgerufen wird und der Rekursionsbaum sich dann verzweigt. Diese einfache Modifikation führt dazu, dass die Elemente-Liste auf dem Weg nach oben zusammenstoßen, was dadurch gelöst wird, dass man sie dann verkettet. 1. Sift(v) 2. Elemente-List (v)Tleer 3. If v hat keine Kinder 4. then setze ckey(v) auf ∞ und return 5. sift(vnext) 6. if ckey(vnext) > ckey (vchild) 7. then tausche vnext und vchild 8. T T U Elemente-List (vnext); 9. If Schleifenbedingung ist erfüllt then gehe zu 5; 10. Elemente-List(v)T Schleifenbedingung: Das ist das, was Soft Heaps von einem Binomialbaum unterscheidet. (i) Das „gehe zu“ wurde noch nicht ausgeführt während dieses „sift“ Aufrufes. (ii) Der Rang von v überschreitet die Schwelle r und Rang von v ist entweder ungerade oder überschreitet den Rang des Ranghöchsten Kindes von v um mind. 2 Anmerkungen: Der Rang der Kopien ist um eins kleiner als das Original. (Kopien für Next Zeiger). Beim Verschmelzen von zwei Itemlisten, wird der ckey aktualisiert. Der größere ckey wird neuer ckey des Knoten mit der neuen Itemliste. 5.1 Fehlerrate: r := 2 + 2[log (1/ε)] (aufgerundet) Lemma 5.1: |Elemente-List(v)| ≤ max{1, 2[rang(v)/2] – r/2} (in [] wird aufgerundet) Lemma 5.2: Der Soft Heap hat zu jeder Zeit höchstens n/2r-3 verfälschte Elemente. 5.2 Die Laufzeit: Es reicht „Meld“ und „sift“ zu betrachten, da alle anderen Operationen in konstanter Zeit ablaufen. „Meld“ geht in linearer Zeit. „sift“ geht in O(rn) Zeit.