Finden Sie max/min der Vektor von Vektoren
Was ist das effizienteste und standard (C++11/14) Weg zu finden, der min - /max-Element-Vektor von Vektoren?
std::vector<std::vector<double>> some_values{{5,0,8},{3,1,9}};
wollte die max-element ist 9
wollte die min element ist 0
std::minmax_element
für die inneren Vektoren.- Warum nicht zu benutzen 2 geschachtelte Schleifen? Die anderen Möglichkeiten, vielleicht weniger lesbar.
- Du meinst das pass-throgh jeder innere Vektor-und call-minmax_elemnt und dann finden die minmax_elemnt das Ergebnis ?
- es ist eine Lösung. Aber ich Frage mich, ob es eine std-Funktion oder das Muster für diese.
- Gehen Sie einfach über jeder Vektor, und erstellen Sie zwei Variablen min und max, und vergleichen Sie Sie
- ja, das ist die Letzte option für mich. Ich war auf der Suche nach etwas mehr klar
- Für die äußere Schleife, es scheint komplizierter zu verwenden, direkt standard-Algorithmus.
- Ich sehe... BTW, ist nicht möglich, profitieren bilden die Kontinuität der Eigenschaft der Speicherung von Vektor, um es zu konvertieren, um damit um so eindimensional ?
- ein Vektor von Vektoren ist nicht zusammenhängend gespeichert, jeder innere Vektor gespeichert ist, in seinem eigenen zusammenhängenden block von dynamisch zugewiesenen Speicher, so kann man nicht wirklich behandeln Sie als "eindimensionale". Sie könnte sich ändern, wie Sie speichern Sie Ihre 2D-array so, dass Sie zusammenhängend gespeichert sind, dann könnten Sie in der Lage sein, um die Implementierung zu vereinfachen ein wenig.
- Sie sollten klären, Ihre Frage - entweder text oder ein Beispiel - deutlich zu machen, die Sie suchen der min-und max -
double
Wert, und nicht die min-und max -vector<double>
angesichtselement
mehrdeutig ist (der äußere Vektor-Elemente sind die inneren Vektoren). - es wurde getan
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer effizienten Art und Weise zur Berechnung der maximalen element in einem 2-D-array(oder vector in deinem Fall) mit einer Komplexität von
O(n^2)
unabhängig von dem, was Sie tun, wie die Berechnung mit einem Vergleich zwischenn*n
Elemente.Beste Weg, in Bezug auf Benutzerfreundlichkeit ist die Verwendungstd::max_element
auf den Vektor von Vektoren.Ich werde nicht tiefer in details einzusteigen.Hier ist die Referenz.O(nlog(n)
. Nur für das einfügen der Werte.O(N)
woN
ist die Gesamtzahl der Elemente, die verglichen werden. Die Tatsache, dass dies physikalisch so angeordnet, wieK
Vektoren von durchschnittlichN/K
sub-Elemente ist ein wenig irreführend.O(n)
. Ich weiß nicht, warum die Leute sagen, quadratische.n^2
Elemente, um die korrekte Antwort bekommen.Egal, was Sie tun, die Komplexität ist nicht reduzierbar darüber hinaus.Es ist wie der berühmte minimale Anzahl von Rassen zu finden, das Schnellste Pferd, problem.std::min_element
ist in Bezug auf die Anzahl der Aufrufeoperator<
im Vergleich zu der Gesamtzahl der ElementeN
. Die Tatsache, dass Sie gliedert sich in mehrere bins spielt keine Rolle, außer für das schreiben von verschachtelten Schleifen, aber die Verschachtelung ist nicht ein "round-robin" - Turnier vergleichen, jedes element zu jedem anderen element. Jedes element ist nur im Vergleich zu den min so weit. Für 100 Nummern, Sie haben 99 Vergleiche. Für eine 1000, Sie haben 999. Es istO(N)
.O(n)
. auch wenn Sie versuchen, die Daten zu verändern, benötigen Sie Zugriff aufm*n
Elemente nicht er ?std::min_element
ist definiert als die Anzahl der Vergleiche im Verhältnis zur Gesamtzahl der Elemente. Es wurde erklärt mehrmals, dass die layout-Vektor-Vektor, ist dabei unerheblich. So downvoted, bis es behoben ist.m*n
.stackoverflow.com/questions/11032015/...O(n)
für beliebige Werte vonr
undc
wor*c = n
. Persönlich, die Berichterstattung über die Komplexität O(n^2) ist irreführend. Ich verstehe, was du meinst obwohl. Ich denke, es wird die Leute verwirren, die sagen, dass es quadratisch ist, nur weil Sie eine verschachtelte Schleife.n*n
. Haben Sie einen Blick auf die zweite Lösung hier: stackoverflow.com/questions/21637241/.... Erstens ist irrelevant, wie es verarbeitet den input.Hier ist ein multi-threaded-Lösung, gibt einen iterator (oder wirft), um das maximum für allgemein Typ
T
(vorausgesetztoperator<
definiert ist, für dieT
). Beachten Sie die wichtigste Optimierung ist die Durchführung der inner-max-Operationen auf die 'Spalten' zu nutzen C++'s column-major ordering.threaded_transform
ist nicht Teil der standard-Bibliothek (noch nicht), aber hier ist eine Implementierung, die Sie nutzen könnten.Wenn Sie ein
boost::multi_array<double, 2>
statt einerstd::vector<std::vector<double>>
es wäre so einfach wie:Live-demo.
Müssen Sie mindestens Blick auf jedes element, so, wie Anony-Maus erwähnt, die Komplexität wird mindestens O(n^2).
Wenn Sie erstellen Sie eine benutzerdefinierte iterator zum Durchlaufen aller
double
Ihrervector
vonvector
eine einfachestd::minmax_element
den jobiterator ist so etwas wie:
Und-Nutzung
Live-Beispiel
Plain
for loop
Weg:Mithilfe der
sammeln
Funktion, die Sie schreiben konnte:aber ich würde lieber die gute alte for-Schleife.
Das Beispiel kann erweitert werden, um sowohl der min-und max-Werte:
Leider ein Vektor, der Vektor ist nicht im Speicher zusammenhängend gespeichert, so dass Sie noch nicht einen einzigen block, welches alle Werte (dies ist einer der Gründe, warum ein Vektor, der Vektor ist nicht ein gutes Modell für eine matrix).
Können Sie die Vorteile der Vektor der Vektor enthält eine Menge von Elementen.
Da jeder sub-Vektor ist autonom, Sie könnte verwenden std::async zu füllen asynchron Vektor der futures mit der max-Wert der einzelnen sub-Vektor.
Können Sie es tun, ziemlich leicht mit Eric Niebler ist Bereich-v3 Bibliothek (die offensichtlich nicht dem standard entspricht noch nicht, aber hoffentlich in nicht allzu ferner Zukunft):
p.first
ist ein iterator auf die min element;p.second
auf die max.(range-v3 verfügt über eine Umsetzung von minmax_element, aber leider erfordert es ein ForwardRange und anzeigen::join nur gibt mir eine InputRange, so kann ich es nicht verwenden.)
Die einfachste Methode wäre zunächst eine Funktion, um zu bestimmen, die min/max-Elemente in einem Vektor, sagen wir, eine Funktion, die aufgerufen wird:
Durch Verweis übergeben wird (lesend) in diesem Fall viel mehr Zeit und Platz sparend (Sie nicht möchten, dass Ihre Funktion das kopieren einer kompletten Vektor). Damit in Ihrer Funktion zu bestimmen, min - /max-element ein Vektor von Vektoren, hätten Sie eine verschachtelte Schleife, wie:
Das problem mit der oben genannten Lösung ist seine Ineffizienz. Von meinem wissen, ist dieser Algorithmus wird im Allgemeinen eine Laufzeit auf O(n^2log(n)) Effizienz, die ist Recht unscheinbar. Aber natürlich ist es immer noch eine Lösung. Obwohl möglicherweise gibt es standard-algorithmen, das finden der min/max eines Vektor für dich, es ist immer mehr vollbringen, ein eigenes zu schreiben, und mit der angegeben wird in der Regel nichts zu tun in Bezug auf die Verbesserung der Effizienz, da der Algorithmus im Allgemeinen der gleiche (für kleine Funktionen, die bestimmen, max/min). In der Tat, theoretisch, standard-Funktionen wäre geringfügig langsamer ausgeführt, da diese Funktionen sind Vorlagen, die für die Bestimmung der Art ist es den Umgang mit run-time.
Können sagen, wir haben einen Vektor namens some_values, wie unten gezeigt
definieren Sie einen eindimensionalen Vektor wie nachfolgend gezeigt
Dann finden Sie heraus, eine maximale/minimale element in dieser eindimensionalen Vektor wie nachfolgend gezeigt
Jetzt bekommen Sie die max/min-Elemente wie unten
oder optimazed Variante: