nieder_bound und top_bound - integrierte binäre Suchfunktionen.

nieder_bound ist eine Funktion, die für die logarithmische Zeit in der Klebemasse das mindestens Element findet, das größer oder gleich dem zugeordneten Wert k ist.
Als Argumente werden die Grenzen von Masse und Bedeutung k akzeptiert.
Er kehrt den Terator an das gefundene Element oder an das Ende der Masse zurück, wenn kein solches Element vorhanden ist.
Sie können die Details lesen. Dokumentation

top_bound ist eine Funktion, die für die logarithmische Zeit in der Klebemasse das kleinste Element findet, das mehr ist als der zugeordnete Wert k.
Als Argumente werden die Grenzen von Masse und Bedeutung k akzeptiert.
Er kehrt den Terator an das gefundene Element oder an das Ende der Masse zurück, wenn kein solches Element vorhanden ist.
Sie können die Details lesen. Dokumentation

Es ist klarzustellen, dass die Verwendung dieser Funktionen auf Set oder Multiset aufgrund des Fehlens eines zufälligen Zugriffs durch die oben genannten Sammlungen nicht für die logarithmische Zeit funktioniert.
Diese Sammlungen haben jedoch entsprechende integrierte Methoden (d.h. ihre Cut-offs verwenden).

Beispiele:
Vektor a = {0, 1, 3, 5, 7};
Vektor:

es = nieder_bound(a.begin(), a.end(), 4);
♪

es = nieder_bound(a.begin(), a.end(), 5);
♪

es = nieder_bound(a.begin(), a.end(), 8);
// it == sync, korrigiert von elderman == @elder_man

es = top_bound(a.begin(), a.end(), 4);
♪

es = top_bound(a.begin(), a.end(), 5);
♪

es = top_bound(a.begin(), a.end(), -1);
♪


/ durch Abzug der Iteratoren kann ein Index des gefundenen Elements erhalten werden
int ind = nieder_bound(a.begin(), a.end(), 4) - a.begin();
/ ind == sync, berichtigt von elderman == @elder_man


/ Verwenden Sie Methoden, um Funktionen für Set und ähnliche Sammlungen zu ersetzen

Menge s{ 1, 3, 5};
Menge:

Sitz = s.lower_bound(3);
♪

Sitz = s.upper_bound(3);
♪

Einzigartig ist eine Funktion, die über lineare Zeit alle Sequenzen derselben aufeinanderfolgenden Elemente in einem komprimiert.
Als Argument erhält man die Grenzen der Masse, in der die Kompression erforderlich ist.
Der Terator kehrt zum neuen Ende (nicht inklusive) der Masse zurück. Es ist wichtig, mit den Elementen nach dem neuen Ende vorsichtig zu sein, aber bis zum alten, weil sie einen unbestimmten Wert haben.
Sie können die Details lesen.Dokumentation

Wenn Sie diese Funktion auf Vektor verwenden, ist es bequem, die Größe mit der Rückkehr zu machen (Details unten).

Beispiele:
Vektor  a = {3, 3, 2, 3, 1, 1, 4, 5, 5};
einzigartig(a.begin(), a.end());
// a = [3, 2, 3, 1, 4, 5, ?, ?


/ durch eine einzigartige Funktion
/ Hilfsmittel zur Komprimierung von Koordinaten

a = { 235, 10, 41, 41, 235, 500, 500};
Art(a.begin(), a.end());
/ a = [10, 10, 41, 41, 235, 235, 500, 500]

a.resize(unique(a.begin(), a.end() - a.begin());
// a = [10, 41, 235,500]

Zusammenführen ist eine Funktion, die zwei fragmentierte Massen kombiniert, nämlich die lineare Zeit erhält eine fragmentierte Masse, die aus den Elementen des ersten und zweiten Satzes besteht.
Sie akzeptiert fünf Argumente: zwei Zeilen für jede Masse und die linke Grenze des Ziels (wo die Elemente des Aufpralls liegen werden).
Details sind verfügbar Dokumentation

Beispiele:
/ Hinweise zu klassifizieren
Vektor a = 1, 3, 5, 7};
Vektor b = {2, 4, 6};

/ Es ist erforderlich, dass der Bestimmungsort ausreichend groß ist
Vektor c(7);

Zusammenschluss (a.begin(), a.end(), b.begin(), b.end(), c.begin());
/ c = [1, 2, 3, 4, 5, 6, 7]


/ Elemente können wiederholt werden
a = 1, 2, 4, 4};
b = {2, 3, 4, 4};
c.resize(10)

Zusammenschluss (a.begin(), a.end(), b.begin(), b.end(), c.begin());
/ c = [1, 2, 3, 4, 4]
Diese Funktion ist im Zusammenhang mit Fusionen sehr praktisch.

nth_element ist eine Funktion, die es erlaubt, das n-Element während der linearen Zeit in der Masse zu finden.
Die Funktion übernimmt die linke Linie der Masse, der Terator in eine Position, die verzerrt in der rechten Begrenzung der Masse zu finden ist.
Wenn die Funktion angewendet wird, wird der notwendige Wert an den Terator gelegt, die restlichen Werte werden chaotisch, aber die linke von n wird nicht größer sein als es und die rechte nicht weniger. Ich meine, es ist zu verstehen, dass diese Funktion die Grundordnung der Elemente bricht.
Details können in der Dokumentation gelesen werden (https://www.cplus.com/reference/algorithm/nth_element/).

Beispiel:
Vektor a = {4, 0, 3, 9, 2, 1, 8, 5, 6, 7};

/ Suchelement für Index 4
// Achten Sie auf die Art der Argumente
nth_element(a.begin(), a.begin() + 4, a.end());
♪
♫

Das Zurücksetzen der Länge n ist ein geordnetes Set ohne Wiederholungsnummern 1, 2, ..., n. Beispielsweise sind [3, 1, 2] und [5, 4, 3, 2, 1] Transverte und [1, 2, 1, 3] und [1, 2, 4] nicht.

Wenn die Herausforderung war, alle Änderungen der Länge n zu entfernen, könnte ein komfortabler C++-Mechanismus namens next_permutation verwendet werden.

Details können inDokumentation, aber der Punkt ist, dass diese Funktion die Remittanz auf eine spätere Rektifikation im Lexikographen (die im Allgemeinen durch seinen Namen verstanden wird) ändert.

Zur Verwendung der next_permutation sollte die Algorithmusbibliothek angeschlossen werden (d.h. #include vergorithm zu Beginn des Programms)

Beispiele:
Vektor arr;

arr = { 1, 2, 3}; / Masse gleich [1, 2, 3]

next_permutation(arr.begin(), arr.end()); / übertragbar in volle Reichweite
/ Jetzt ist die Masse [1, 3, 2]


arr = {2, 3, 1}; / Masse gleich [2, 3, 1]

next_permutation(arr.begin(), arr.end()); / übertragbar in volle Reichweite
/ Nun ist die Masse gleich [3, 1, 2]

next_permutation(arr.begin() + 1, arr.begin() + 3); / kann auf Teile der Masse angewendet werden, aber in der Praxis ist dies selten erforderlich
/ Nun ist die Masse gleich [3, 2, 1]

In diesem Fall hat die Funktion einen Lampen-Reset-Wert, der gleichermaßen wahr ist, wenn der nächste Stopp gesichert und falsch ist, wenn das folgende nicht erfolgt ist (ein Dienst, wenn der maximale Stop auf die Funktion in der lexikographischen Reihenfolge übertragen wird).
Dies ermöglicht es, die Funktion im Zyklus zu nutzen, wodurch wir alle Transformationen wechseln können. Aufgrund der 0-Angabe ist es in der Praxis oft einfacher, mit einem Rücksetzen zwischen 0 und n-1 zu arbeiten, obwohl die Unterbrechung formal zwischen 1 und n liegt. Glücklicherweise führt dies aber nicht zu zusätzlichen Codeauskleidungen, da die Funktion von next_permutation an den 0-indizierten Reset angepasst ist (und sogar repetitive Elemente in der Masse, aber Sie können sich genauer informieren).

Im allgemeinen ist der Massenumwandlungscode wie folgt:
int n; /

Vektor perm(n); // perm - Reduktion von "Permutation, d.h. "reset".
für (int i = 0; i À n; i+++)
perm[i] = i; // initial reset 0, 1, ..., n-1

und
/ innerhalb des Zyklus verarbeitete Stromkonvertierung

} während (next_permutation(perm.begin(), perm.end())); / wenn kein nächster Reset vorliegt, der Endzyklus



Dieser Code funktioniert für O(n! * f(n)), wo f(n) die Zeit ist, die Sie einen bestimmten Reset bearbeiten.