Was ist der beste Weg, um den minimalen oder maximalen Wert von einem Array von Zahlen zu erhalten?
Sagen wir, ich habe ein Array von zahlen: [2,3,3,4,2,2,5,6,7,2]
Was ist der beste Weg zu finden, die minimale oder maximale Wert in diesem Array?
Recht jetzt, um das maximum, ich bin die Schleife durch das Array und das zurücksetzen einer Variablen auf den Wert, wenn es größer ist als der vorhandene Wert:
var myArray:Array /* of Number */ = [2,3,3,4,2,2,5,6,7,2];
var maxValue:Number = 0;
for each (var num:Number in myArray)
{
if (num > maxValue)
maxValue = num;
}
Diese einfach nicht scheinen, wie die am besten abschneidenden Weise, dies zu tun (versuche ich zu vermeiden, Schleifen, Wann immer möglich).
Kommentar zu dem Problem
Läuft eine foreach auf einfache arrays wie dieses ist nie ein Engpass. Das einzige mal, Schleifen teuer ist, wenn Sie etwas böses tun, wie ausführen von SQL innerhalb einer Schleife oder "duplizieren" eine Art der Berechnung, wird immer die gleiche jedes mal. Keine Angst vor der Schleife, mein Freund!
Was ist Los mit Schleifen?
Was Sie versuchen müssen, um zu vermeiden, tief verschachtelte Schleifen...
InformationsquelleAutor der Frage Eric Belair | 2009-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den theoretischen Antworten von allen anderen sind alle nett, aber seien wir pragmatisch. ActionScript bietet die tools, die Sie benötigen, so dass Sie nicht selbst schreiben eine Schleife, in diesem Fall!
Beachten Sie zunächst, dass
Math.min()
undMath.max()
können eine beliebige Anzahl von Argumenten. Es ist auch wichtig zu verstehen, dieapply()
Methode zur Verfügung, umFunction
Objekte. Es ermöglicht Ihnen die Argumente an die Funktion mit einemArray
. Lassen Sie uns den Vorteil von beiden:Hier ist der beste Teil: der "loop" ist eigentlich die Ausführung von nativen code (in Flash Player), so dass es ist schneller als die Suche nach der minimalen oder maximalen Wert mit einem reinen ActionScript-Schleife.
InformationsquelleAutor der Antwort joshtynjala
Es gibt keinen zuverlässigen Weg, um die minimum - /maximum-ohne Prüfung jeden Wert. Sie wollen nicht, um zu versuchen, eine Art oder etwas ähnliches, zu Fuß durch das array ist O(n), das ist besser als jede sort-Algorithmus kann im Allgemeinen Fall.
InformationsquelleAutor der Antwort Adam Bellaire
Wenn
Dann gibt es einen Algorithmus, der Sie findet, min-und max-3n/2 Anzahl der Vergleiche. Was man tun muss, ist ein Prozess, der Elemente des Arrays paarweise. Der größere der beiden, sollten verglichen werden mit der aktuellen max und das kleinere der beiden verglichen werden sollte, mit dem Strom min. Auch braucht man Besondere Vorsicht, wenn das Feld enthält ungerade Anzahl von Elementen.
In c++ - code ("borrowing code von Mehrdad).
Es ist sehr leicht zu sehen, dass die Anzahl der Vergleiche, die es nimmt, ist 3n/2. Läuft die Schleife n/2 mal und in jeder iteration werden 3 Vergleiche durchgeführt werden. Dies ist wahrscheinlich das optimum kann man erreichen. In diesem moment, ich kann nicht zeigen Sie auf eine bestimmte Quelle. (Ich denke aber, dass ich gesehen habe, ein Beweis dafür, dass irgendwo.)
Die rekursive Lösung von Mehrdad oben, wohl auch erreicht, diese minimale Anzahl von vergleichen (die Letzte Zeile muss geändert werden). Aber mit der gleichen Anzahl von vergleichen, die eine iterative Lösung immer schlagen eine rekursive Lösung aufgrund der overhead in der Funktionsaufruf, wie er erwähnt. Wenn man jedoch kümmert sich nur über die Suche nach min und max ein paar zahlen (als Eric Belair hat), wird niemand bemerken einen Unterschied in der heutigen computer mit einem der Ansätze vor. Für ein großes array der Unterschied erheblich sein können.
Obwohl sich diese Lösung und die Lösung von Matthew Brubaker hat O(n) Komplexität, in der Praxis sollte man sorgfältig beurteilen, die versteckten Konstanten beteiligt. Die Anzahl der Vergleiche in seine Lösung ist 2n. Der speedup gewann mit der Lösung mit 3n/2 Vergleiche, im Gegensatz zu 2n Vergleiche würde sichtbar sein.
InformationsquelleAutor der Antwort
Wenn das array sortiert ist, dass das beste ist, du gehst zu erhalten. Wenn es sortiert ist, nehmen Sie nur die ersten und letzten Elemente.
Natürlich, wenn es nicht sortiert sind, dann Sortieren Sie zuerst und packte das erste und Letzte ist garantiert weniger effizient, als nur einmal Durchlaufen. Selbst die besten algorithmen zur Sortierung betrachten jedes element mehr als einmal (durchschnittlich O(log N) mal für jedes element. Das ist O(N*Log N) insgesamt. Bei einem einfachen scan einmal Durchlaufen, ist nur O(N).
Wenn Sie wollen schnellen Zugriff auf das größte element in einer Datenstruktur, werfen Sie einen Blick auf die Haufen, die für einen effizienten Weg, um die Objekte in Ordnung.
InformationsquelleAutor der Antwort Eclipse
Müssen Sie eine Schleife durch das array, keine andere Möglichkeit zu prüfen, alle Elemente. Nur eine Korrektur für den code - wenn alle Elemente negativ sind, maxValue auf 0 am Ende. Sollten Sie initialisieren es mit der minimal mögliche Wert für integer.
Und wenn Sie gehen, um zu suchen das array viele Male, ist es eine gute Idee, Sortieren Sie zuerst als die Suche ist schneller (binäre Suche) und die minimale und maximale Elemente sind nur der erste und der Letzte.
InformationsquelleAutor der Antwort Rumen Georgiev
Hängt davon ab, was Sie rufen Sie "am besten" ist. Aus einer theoretischen Sicht, die Sie nicht lösen können das problem in weniger als
O(n)
in einer deterministischen Turing-Maschine.Den naiven Algorithmus zu loop und aktualisieren min, max. Jedoch, eine rekursive Lösung erfordert weniger Vergleiche als naive Algorithmus, wenn Sie möchten, um min -, max-gleichzeitig (es ist nicht unbedingt schneller durch Funktionsaufruf-overhead).
Die einfachste Lösung wäre, zu Sortieren und die ersten und letzten Element, obwohl es natürlich nicht die Schnellste 😉
Die beste Lösung, performance-Weise, zu finden, die minimale oder maximale ist der naive Algorithmus Sie geschrieben (mit einem single-loop).
InformationsquelleAutor der Antwort Mehrdad Afshari
Math.max() ist eigentlich as3-code, kompiliert, AVM2-opcodes, und als solche ist nicht mehr "native" als jede andere as3-code. Als Folge, es ist nicht unbedingt die Schnellste Implementierung.
Eigentlich gegeben, dass es funktioniert auf Array-Typ, es ist langsamer als sorgfältig geschriebenen code usign Vektor:
Habe ich eine schnelle benchmark-Vergleich der verschiedenen naive Vektor-und Array-Implementierungen der Mathematik.max, mit gskinner ist PerformanceTest (Vektor-und Array wird gefüllt mit identischen Zufallszahlen).
Der Schnellste Vektor-Umsetzung zu sein schien, mehr als 3x schneller als Mathe.max mit der letzten AIR-SDK/release-player (flash-player GEWINNEN 14,0,0,122 VERSION, kompiliert mit den AIR-SDK-14):
Durchschnitt 3,5 ms für 1.000.000 Werte, im Vergleich zu Mathe.max() durchschnittlich 11ms :
Schlussfolgerung ist, dass, wenn Sie sind besorgt über die Leistung, die Sie verwenden sollten, Vektor über Array-überall können Sie in den ersten Platz, und nicht immer verlassen sich auf Standard-Implementierungen, vor allem, wenn Sie erzwingen Sie die Verwendung des Array -
PS:gleiche Implementierung mit einer for-each () - Schleife 12x langsamer ...!
InformationsquelleAutor der Antwort jauboux
Dies hängt davon ab, auf real-world-Anwendung Anforderungen.
Wenn Ihr Frage ist nur hypothetisch, dann die Grundlagen wurden bereits erläutert. Es ist eine typische Suche vs. Art problem. Es wurde bereits erwähnt, dass die algorithmisch Sie sind nicht zu erreichen, besser als O(n) für diesen Fall.
Allerdings, wenn Sie sind auf der Suche praktischen Einsatz, werden die Dinge interessanter. Sie müssten dann überlegen, wie groß das array ist, und die Prozesse, die in das hinzufügen und entfernen von aus dem Daten-set. In diesen Fällen kann es am besten, um die rechnerische 'Treffer' bei einfügen /entfernen Zeit durch die Sortierung nach den Fliegen. Einfügungen in einem vorsortierten array sind nicht so teuer.
Die Schnellste Abfrage-Antwort auf die Min-Max-Anfrage wird immer von einem sortierten array aus, denn wie andere erwähnt haben, Sie nehmen Sie einfach das erste oder das Letzte element - geben Sie einen O(1) Kosten.
Für ein bisschen mehr von einer technischen Erklärung auf die rechnerische Kosten-und Big-O-notation, check out Wikipedia-Artikel hier.
Nick.
InformationsquelleAutor der Antwort Nick
Wenn Sie das array einmal und wollen das maximum nur einmal Durchlaufen, ist das beste, was Sie tun können.
Wenn Sie möchten, ändern Sie das array und gelegentlich auch wollen zu wissen die maximale element verwenden, sollten Sie Priorität. Eine der besten Datenstrukturen für die ist Fibonacci-Heap, wenn das zu kompliziert ist, verwenden Sie eine Binary Heap, die ist langsamer, aber immer noch gut.
Zu minimum und maximum finden, einfach bauen zwei Haufen, und ändern Sie die Vorzeichen der zahlen in einem von Ihnen.
InformationsquelleAutor der Antwort martinus
Bitte berücksichtigen Sie, dass das Sortieren das array wird nur schneller, looping, bis zu einer bestimmten Größe des Arrays. Wenn dein array zu klein ist (und es wird so sein, dass jeder mal), dann ist deine Lösung absolut in Ordnung. Aber wenn es vielleicht zu groß, sollten Sie eine bedingte Nutzung der sort-Ansatz, wenn das array zu klein ist, und die normale iteration, wenn es zu groß ist
InformationsquelleAutor der Antwort
Wenn Sie möchten, finden sowohl die min und max in der gleichen Zeit, die Schleife kann wie folgt geändert werden:
Dürfte dies erreichen O(n) timing.
InformationsquelleAutor der Antwort Matthew Brubaker
Kürzeste Weg :
Math.min.apply(null,array); //das return min-Wert aus array
Math.max.apply(null,array); //das return max Wert aus array
otherway immer min & max Wert aus array
Wie Sie sehen können, wird der code in diesen beiden Funktionen sehr ähnlich ist. Die Funktion legt eine variable - max (oder min) und läuft dann durch das array mit einer Schleife, die überprüfung jedes nächste element. Wenn das nächste element höher als die aktuelle, legen Sie es auf max (oder min). Am Ende, wieder die Nummer.
InformationsquelleAutor der Antwort sajankumar vijayan
Gibt es eine Reihe von Möglichkeiten, dies getan werden kann.
Vergleiche und 2N Schritte)
So finden Sie max. und min. in der Reihe, mit einem minimum an vergleichen?
Wenn Sie wirklich paranoid über Geschwindigkeit, Laufzeit & Anzahl der Vergleiche, siehe auch
http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/
InformationsquelleAutor der Antwort Shogo Warrior
Algorithmus MaxMin(Erster, letzter, max, min)
//Dieser Algorithmus speichert den höchsten und niedrigsten element
//Werte des globalen Arrays A in die globalen Variablen max und min
//tmax und tmin sind temporäre Globale Variablen
InformationsquelleAutor der Antwort Sharief Muzammil
Unten ist die Lösung mit o(n):-
InformationsquelleAutor der Antwort Ajay
Überrascht niemand erwähnt die Parallelität hier.
Wenn du wirklich eine riesige Auswahl, die Sie verwenden können, parallel, sub-Bereiche.
Am Ende vergleichen Sie alle sub-ranges.
Aber die Parallelität kommt der Breite einige Strafe zu, so würde dies nicht optimieren Sie auf kleinen arrays. Allerdings, wenn Sie haben große Datenbestände, beginnt es Sinn zu machen, und Sie bekommen ein time division Reduktion nähert sich der Menge von threads, die den test ausführen.
InformationsquelleAutor der Antwort user3800527
Nach der Lektüre jeder ' s Kommentare (vielen Dank für Ihre Interesse), fand ich, dass die "beste" Möglichkeit (geringste Menge an code, die am besten durchführen) zu tun, war einfach Sortieren Sie das Array, und dann nehmen Sie den ersten Wert im Array:
Funktioniert das auch für ein Array von Objekten - Sie verwenden einfach den Array.sortOn () - Funktion und eine Eigenschaft angeben:
Ich hoffe, dies hilft jemand anderes eines Tages!
InformationsquelleAutor der Antwort Eric Belair