Wir brauchen ADT mit Such- und Rankingfunktionen. Das heißt, zusätzlich zur Schnittstelle der STL-Map ist eine Funktion "int get_rank(key)" erforderlich.
Die Standardimplementierung einer solchen Funktion erfordert die Unterstützung und Aktualisierung eines zusätzlichen Integer-Feldes in jedem Knoten des selbstbalancierten Suchbaums (z. B. im schwarz-roten Baum, der in STL map/set verwendet wird). Aber es scheint, dass STL map/set dies nicht tut.
Wir suchen eine Lösung, die auf Standard-Containern (STL, Boost) basiert und die bestmögliche Zeitkomplexität aufweist: Finden/Hinzufügen/Löschen eines Elements dauert O(log n) (wie in STL map/set), die Berechnung des Rangs durch einen Schlüssel dauert ebenfalls O(log n).
Unter dem Rang eines Elements versteht man die Position des Elements in der sortierten Folge aller Elemente der Karte/Menge.
Beispiel. Menge = {0, 4, 6, 7, 8} Rang(0)=1, Rang(4)=2, Rang(6)=3, Rang(7)=4, Rang(8)=5.
Unserer Meinung nach kann das Problem unter den oben genannten Zeitkomplexitätsbedingungen nicht durch eine Kombination von zwei Karten gelöst werden, von denen eine nach dem Schlüssel und die andere nach dem Rang sortiert ist.
Merci.
1 Stimmen
Die Komplexität von Suchen, Einfügen und Löschen steht oft in umgekehrtem Verhältnis zueinander. Wir können nicht entscheiden, welcher Kompromiss für Sie am besten ist.
1 Stimmen
Es gibt eine Implementierung des Rangbaums, die alle Anforderungen an die Zeitkomplexität erfüllt, siehe z.B. das Buch von Cormen, T.H. "Introduction to Algorithms".
1 Stimmen
Es kann mit der GNU-Erweiterung in der
libstdc++
siehe aquí .