Die Bently-Saxe-Methode ergibt eine recht natürliche Warteschlange mit stabiler Priorität.
Speichern Sie Ihre Daten in einer Folge von sortierten Arrays . A Ich habe Größe 2 Ich . Jedes Array unterhält auch einen Zähler c i . Die Array-Einträge A i [ c i ] , ... , A i [ 2 i - 1 ] enthalten Daten.A0,…,AkAi2icichEINich[ cich] , … , Aich[ 2ich- 1 ]
Für jedes wurden alle Elemente in A i in jüngerer Zeit als die in A i + 1 hinzugefügt, und in jedem A i -Element wird die Reihenfolge nach dem Wert geordnet, wobei Bindungen durch Platzieren älterer Elemente vor neueren Elementen aufgehoben werden. Beachten Sie, dass dies bedeutet, dass wir A i und A i + 1 zusammenführen und diese Reihenfolge beibehalten können. (Im Falle von Bindungen während der Zusammenführung nehmen Sie das Element von A i + 1. )ichEINichEINi + 1EINichEINichEINi + 1EINi + 1
Um einen Wert einzufügen , suchen Sie das kleinste i , sodass A i 0 Elemente enthält, führen Sie A 0 , … , A i - 1 und x zusammen , speichern Sie dies in A i und setzen Sie c 0 , … , c i entsprechend.xichEINichEIN0, … , Ai - 1xEINichc0, … , Cich
Um die min zu extrahieren, finde den größten Index so, dass das erste Element in A i [ c i ] über alle i minimal ist und c i inkrementiert .ichEINich[ cich]ichcich
Nach dem Standardargument ergibt dies eine amortisierte -Zeit pro Operation und ist aufgrund der oben beschriebenen Reihenfolge stabil.O ( logn )
Für eine Folge von Einfügungen und Auszügen werden n Array-Einträge (keine leeren Arrays) plus O ( log n ) Wörter mit Buchhaltungsdaten verwendet. Es beantwortet nicht Mihais Version der Frage, aber es zeigt, dass die stabile Einschränkung nicht viel Platz in Anspruch nimmt. Insbesondere zeigt es, dass es keine Untergrenze von Ω ( n ) für den zusätzlichen Raum gibt, der benötigt wird.nnO ( logn )Ω ( n )
Update: Rolf Fagerberg weist darauf hin, dass diese gesamte Datenstruktur in ein Array der Größe gepackt werden kann , wobei n die Anzahl der bisherigen Einfügungen ist , wenn wir Nullwerte (Nicht-Datenwerte) speichern können .nn
Beachten Sie zunächst, dass wir in dieser Reihenfolge in ein Array packen können (mit A k zuerst, gefolgt von A k - 1, wenn es nicht leer ist, und so weiter). Die Struktur davon wird vollständig durch die Binärdarstellung von n , der Anzahl der bisher eingefügten Elemente, codiert . Wenn die Binärdarstellung von n eine 1 an der Position hat i , dann A i wird besetzen 2 i Matrixort, sonst wird es keine Feldpositionen besetzen.EINk, … , A0EINkEINk - 1nnichEINich2ich
Wenn Sie einfügen und die Länge unseres Arrays um 1 erhöhen, können Sie A 0 , … , A i und das neue Element mithilfe vorhandener stabiler Zusammenführungsalgorithmen zusammenführen.nEIN0, … , Aich
Wo wir nun Nullwerte verwenden, müssen wir die Zähler loswerden . In A i speichern wir den ersten Wert, gefolgt von c i -Null-Werten, gefolgt von den verbleibenden 2 i - c i - 1- Werten. Während einer Extraktionsminute können wir den zu extrahierenden Wert in O ( log n ) -Zeit finden, indem wir A 0 [ 0 ] , … , A k [ 0 ] untersuchen . Wenn wir diesen Wert in A i [ 0 findencichEINichcich2ich- cich- 1O ( logn )EIN0[ 0 ] , … , Ak[ 0 ] wir A i [ 0 ] auf null und führen dann eine binäre Suche auf A i durch , um den ersten Nicht-Null-Wert A i [ c i ] zu finden und A i [ 0 ] und A i [ c i ] zu tauschen.EINich[ 0 ]EINich[ 0 ]EINichEINich[ cich]EINich[ 0 ]EINich[ cich]
Das Endergebnis: Die gesamte Struktur kann mit einem Array implementiert werden, dessen Länge mit jeder Einfügung erhöht wird, und einem Zähler , der die Anzahl der Einfügungen zählt.n