Den kleinsten und größten Wert in NSArray von NSNumbers finden
Was ist eine effektive und gute Möglichkeit, zu vergleichen, alle Werte von NSArray
enthält NSNumbers
aus floats
zu finden, der größte und der kleinste?
Irgendwelche Ideen, wie dies zu tun, nett und schnell in objective-c
?
Kommentar zu dem Problem
Es gibt keine solche Sache wie ein NSArray, enthält schwimmt. Es müsste ein NSArray, enthält NSNumbers.
@matt Danke! Habe ich korrigiert, die Frage nach dem Namen
InformationsquelleAutor der Frage Sergey Grischyov | 2013-04-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ausführungsgeschwindigkeit (nicht Programmierung) wichtig ist, dann eine explizite Schleife ist die Schnellste. Ich habe die folgenden tests mit einer Reihe von 1000000 Zufallszahlen:
Version 1: Sortieren Sie das array:
Version 2: Key-value-coding, mit "doubleValue":
Version 3: der Schlüssel-Wert-Codierung, die mit "selbst":
Version 4: Explizite Schleife:
Version 5: Block-enumeration:
Dem test-Programm erstellt ein array mit 1000000 Zufallszahlen, und wendet dann alle Sortieren
Techniken, die auf das gleiche array. Die Zeiten oben sind der output von einem Lauf, aber ich mache ca 20 läuft mit sehr ähnlichen Ergebnissen in jedem Lauf. Ich habe auch die Reihenfolge geändert, in der die 5 Sortierverfahren angewendet werden, um auszuschließen, caching-Effekte.
Update: ich habe jetzt eine (hoffentlich) bessere test-Programm. Der vollständige Quellcode ist hier: https://gist.github.com/anonymous/5356982. Die durchschnittlichen Zeiten für die Sortierung ein
array mit 1000000 Zufallszahlen (in Sekunden, auf einen 3.1 GHz Core i5 iMac, release kompilieren):
Update 2: Wie man sehen kann, fallen die Aufzählung ist schneller als der block enumeration (das ist auch hier gesagt: http://blog.bignerdranch.com/2337-incremental-arrayification/).
EDIT: Der folgenden ist völlig falsch, weil ich vergessen habe zu initialisieren das Objekt als lock, Hot Licks richtig bemerkt, so dass keine Synchronisation durchgeführt.
Und mit
lock = [[NSObject alloc] init];
die gleichzeitige Aufzählung ist so langsamdas wage ich nicht zu zeigen das Ergebnis. Vielleicht ein schneller Synchronisierungsmechanismus könnte
Hilfe ...)
Dies ändert sich dramatisch, wenn Sie das
NSEnumerationConcurrent
option, um dieblock enumeration:
Das timing hier ist
so ist es etwa doppelt so schnell wie fast-enumeration. Das Ergebnis ist wahrscheinlich nicht repräsentativ
denn es hängt von der Anzahl der verfügbaren threads. Aber interessant auf jeden Fall! Beachten Sie, dass ich
der am einfachsten zu bedienende Synchronisations-Methode, die vielleicht nicht die schnellsten.
InformationsquelleAutor der Antwort Martin R
Sparen Sie schweben durch die Verpackung unter NSNumber dann
*Nicht zusammengestellt und geprüft, auch schon überprüft mit intValue, nicht sicher über Doppel-oder float -
InformationsquelleAutor der Antwort Anoop Vaidya
Sortieren. nehmen Sie das erste und das Letzte element.
btw: you cant store schwimmt in einem NSArray, müssen Sie wickeln Sie Sie in NSNumber-Objekte.
InformationsquelleAutor der Antwort vikingosegundo
Stimme ich mit Sortieren das array dann Kommissionierung die ersten und letzten Elemente, aber ich finde diese Lösung eleganter (das funktioniert auch für nicht numerische Objekte durch ändern der Vergleich im block):
Wenn Sie wirklich wollen, bekommen Lust, und haben eine wirklich lange Liste, und Sie wollen nicht zu sperren Haupt-thread, dieser sollte funktionieren:
InformationsquelleAutor der Antwort JonahGabriel
Einfach gemacht
InformationsquelleAutor der Antwort Frank