Ich frage mich, was ist die große O-Notation für die Iteration durch NSSet. Die Antwort für ein NSArray ist offensichtlich O (n) - aber was ist die Antwort für NSSet? Auch - ich nehme an, die gleiche Antwort würde für NSDictionary gelten?Was ist die Groß-O-Notation für die Iteration durch NSSet und NSDictionary
Antwort
Sie können sich ein Bild von der Rechenkomplexität von Apples Datenstrukturen machen, indem Sie sich die Kommentare in den Kopfzeilen ihrer überbrückten Core Foundation-Äquivalente ansehen (da sie im Grunde denselben Code unter der Haube verwenden).
Interessanterweise ist die Zeitkomplexität von CFArray
ist nicht tatsächlich garantiert O (n) sein:
Komplexitäts
Die Zugriffszeit für einen Wert in der Anordnung garantiert bei sein schlechteste O (LG N) für jede Implementierung, aktuelle und zukünftige, aber wird oft O (1) (konstante Zeit) sein. Lineare Suchoperationen ähnlich haben eine Worst-Case-Komplexität von O (N * lgN), obwohl die Grenzen typischerweise enger sind, und so weiter. Einfüge- oder Löschoperationen werden typischerweise linear in der Anzahl von Werten in dem Array sein, aber kann im schlimmsten Fall in einigen Implementierungen eindeutig O (N * lgN) sein. Es gibt keine bevorzugten Positionen innerhalb des Arrays für die Leistung; das heißt, es ist nicht unbedingt schneller auf Werte mit niedrigen Indizes zuzugreifen, oder Werte mit hohen Indizes einzufügen oder zu löschen, oder was auch immer.
Diese Zeit Komplexität lassen vermuten, dass CFArray
(und damit NSArray
) könnte in der Tat als ein Baum implementiert werden (Tests zeigen, dass es könnte sogar zwischen mehreren zugrunde liegenden Datenstrukturen werden schaltend).
Ebenso für CFDictionary
, die gegebenen Grenzen haben schon ein breites Spektrum:
Komplexitäts
Die Zugriffszeit für einen Wert im Wörterbuch ist garantiert bei schlimmsten OS (N) für seine jede Implementierung, aktuelle und zukünftige, aber wird oft O (1) (konstante Zeit) sein. Einfüge- oder Löschvorgänge sind typischerweise ebenfalls konstante Zeiten, sind aber in einigen Implementierungen O (N * N) in dem schlechtesten Fall . Der Zugriff auf Werte über einen Schlüssel ist schneller als der direkte Zugriff auf Werte (wenn es solche Operationen gibt). Wörterbücher verwenden tendenziell wesentlich mehr Speicher als ein Array mit der gleichen Anzahl von Werten.
Ich war nicht in der Lage einen ähnlichen Kommentar in dem Core Foundation-Header für CFSet
zu finden, aber Inspektion des Quellcodes zeigt, dass es auf CFBasicHash
basiert, die eine Hash-Tabelle ist, so würde die Zeitkomplexität als typisch für eine Hash-Tabelle - typischerweise O (1) Einfügen, Entfernen und Testen und im schlimmsten Fall O (n).
Wenn Sie wirklich wissen möchten, wie diese Datenstrukturen genau funktionieren, ist Core Foundation Open Source, so dass Sie den Quellcode unter Apple's website lesen können.
- 1. PHP Anzeige Reihenfolge für die Iteration durch mehrere Arrays
- 2. Zugriff auf die Xml-Nodes durch Iteration C#
- 3. Warum ist die Iteration durch die Liste <String> langsamer als die aufgeteilte Zeichenfolge und iteriert sie über StringBuilder?
- 4. Was ist die Beziehung zwischen Rekursion und Beweis durch Induktion?
- 5. Django "durch" Modell Iteration
- 6. behafteten Komponenten durch Iteration
- 7. Ist die Iteration im folgenden Code erforderlich?
- 8. Was ist die umgekehrte Nachbestellung?
- 9. Python Iteration durch stdout
- 10. Was ist die -H Flag für Pip?
- 11. Wie finde ich die Fibonancci-Serie durch Iteration?
- 12. Wie analysiere ich eine Nachricht in die DynamicMessage-Klasse und mache dann die Iteration durch die Felder?
- 13. Ist es möglich, die Aktionen durch die Löschtaste und die OnClose für alertify.js
- 14. Was ist die Rechtfertigung für die Ablehnung teilweisen PUT?
- 15. Was ist der Unterschied zwischen Iteration und Traversierung?
- 16. Was ist die beste Strategie für die Speicherung großer Datenmengen?
- 17. Was bedeutet "Cut-Off" und "Iteration" für Schulungen in OpenNLP?
- 18. Was ist und was ist die Verwendung der Closure „Richtlinie“
- 19. Was ist die beste Vorgehensweise für die Durchführung eines Passwortvergleichs?
- 20. Mit schneller Enumeration und einem NSDictionary ist die Iteration in der Reihenfolge der Schlüssel nicht garantiert - wie kann ich es so machen, dass es in Ordnung ist?
- 21. Selenium WebDriver - Iteration durch Tabellenzeilen
- 22. Was ist die Null für eine Zeichenfolge?
- 23. Was ist die effizienteste Datenstruktur für Keywords?
- 24. Was ist die beste Bereitstellungsstrategie für ASP.NET?
- 25. Was ist die Rekursionsgleichung für diesen Multiplikationsalgorithmus?
- 26. Was ist die JVMID?
- 27. Was ist die Standardspeicherklasse für globale Variablen?
- 28. Was ist die Startsequenz für Emacs?
- 29. Was ist die schnellstmögliche Sicherheitskonfiguration für netTcpBinding?
- 30. Was ist die beste Alternative für QueryString
Wenn Sie Wert auf Leistung legen, stellen Sie sicher, dass Sie "schnelle Enumeration" oder Blöcke verwenden. Verwenden Sie keine regelmäßige C 'for' oder' while' Schleife. https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Collections/Articles/Enumerators.html –
Diese Frage ist eher ein Kuriositätsthema als eine tatsächliche Frage – YogevSitton
ich sehe. Nun, dann hängt die Antwort davon ab, was im Set ist. NSSet ist keine einfache Klasse, ich wäre nicht überrascht, wenn die Implementierung Zehntausende von Zeilen Code ist. Für Anfänger gibt es nicht einmal eine echte Klasse namens "NSSet". Das ist nur ein Name, der verwendet wird, um alle realen Klassen zu verbinden, die in Sets eingehen. Welche Klasse tatsächlich verwendet wird, ändert sich abhängig vom Inhalt des Sets und den Mustern, die Ihr Code verwendet, um auf das Set zuzugreifen. Im Allgemeinen hat ein Set mit 5 Items sehr unterschiedliche Leistungsmerkmale wie ein Set mit 5 Milliarden Items. Und ja, es kann so viele Daten verarbeiten. –