Ich brauche ein Element in sortierte Bereich einzufügen, aber ich muß auch seinen Index (Anzahl der Elemente in dem Bereich, das ist weniger als das Element) kennen. Ich möchte dies in O (logN) Zeit tun. Kann ich das mit einfachen C++ Containern machen?effizienteste Weg, ein Element in sortierten Array einfügen und findet den Index
Ich dachte, std :: multimap zu verwenden, mit diesem Container kann ich das Element an seinen Platz mit O (logN) Komplexität einfügen. Aber um den Index zu erhalten, muss ich std :: distance aufrufen, was O (N) -Operationen erfordert, da der Multimap-Iterator kein zufälliger Zugriff ist.
Ein anderer Weg ist, um std sortiert verwenden :: vector und std :: binary_search Algorithmus. In diesem Fall dauert die Suche O (logN), aber die Einfügung wird O (N) -Operationen benötigen, da die Einfügung in die Mitte des Vektors eine lineare Operation ist.
So gibt es std/Boost-Container, die ich verwenden kann, um das Ergebnis zu erreichen, oder ich brauche, um meine eigene Struktur für diesen zu implementieren? Vielen Dank!
Ich bin oben nicht mit der Komplexität Garantien der Boost-Multiindex zu beschleunigen, aber Sie könnten einen Blick – sehe
Ich schätze, dass es bei einer benutzerdefinierten Baum-/Skiplistenimplementierung möglich ist, die Anzahl der von jedem (inneren) Knoten repräsentierten Elemente zu verfolgen. Aber Sie wissen, dass ein solcher Index ungültig wird, sobald Sie ein anderes Element einfügen? – leemes
Wie groß ist die Bandbreite der Indizes, über die wir sprechen? Wenn es nicht so groß ist (einige Millionen), könntest du einen Fenwick-Baum verwenden, der ziemlich einfach zu programmieren ist.Andernfalls könnten Sie einen ausgeglichenen Binärbaum codieren und sich die Anzahl der Knoten in jedem Teilbaum merken. AFAIK-Standardcontainer sind hier keine große Hilfe. Möchte wissen, ob da etwas im Boost ist. – ead