Ich weiß, dass .append
gelegentlich die Kapazität eines Arrays erhöht und eine neue Kopie des Arrays bilden, aber wird .removeLast
dies jemals umkehren und die Kapazität eines Arrays durch Kopieren in ein neues kleineres Array reduzieren?Reduziert `removeLast` jemals die Kapazität eines Arrays in swift?
Antwort
Nein (oder zumindest, wenn es ja ist, ist es ein Fehler (*)). Das würde sein Komplexitätsversprechen verletzen.
Wenn Sie die Komplexität Versprechen für append
lesen, heißt es:
Komplexität: Amortisierte O (1) über viele Ergänzungen. Wenn das Array eine überbrückte NSArray-Instanz als Speicher verwendet, ist die Effizienz nicht angegeben.
„Amortisieren O (1) über viele Hinzufügungen“ bedeutet, dass für jede gegebene Operation nicht O sein kann (1), aber die Grenze wie die Anzahl der Elemente geht gegen unendlich ist O (1), weil größere und es werden größere Vorabzuweisungen vorgenommen, so dass Umschichtungen immer seltener werden.
nun die Komplexität Versprechen für removeLast()
lesen:
Komplexität: O (1)
Es gibt keinen Ort für eine Umverteilung in dort zu verstecken (oder zumindest könnte es nicht umgesetzt werden "durch Kopieren in ein neues kleineres Array").
(*) Es gibt eine schwierige Ausnahme. Jede Mutation in einem Array unterliegt einer möglichen Kopie beim Schreiben. Das bedeutet, dass jede Mutation, egal was es verspricht, O (n) wird, wenn sie den Speicher mit einem anderen Array teilt. Dies macht das Nachdenken über Swift sehr schwierig, ist aber nicht spezifisch für diese Frage.
Wie Rob Napiers Antwort darauf hinweist, sollte removeFirst
die Kapazität des Arrays nicht reduzieren. Hinzufügen von einigen Details, removeLast
nicht auch, und removeAll
funktioniert standardmäßig, obwohl es einen Parameter keepingCapacity
erfordert, um dieses Verhalten zu ändern.
var arr = [Int]()
print(arr.capacity) // 0
arr.append(1)
print(arr.capacity) // 2
arr.append(2)
print(arr.capacity) // 2
arr.removeFirst()
print(arr.capacity) // 2
arr.removeLast()
print(arr.capacity) // 2 (though the array is now empty)
arr.removeAll(keepingCapacity: true)
print(arr.capacity) // 2
arr.removeAll()
print(arr.capacity) // 0
- 1. Array mit Kapazität in Swift
- 2. Ist es möglich, dass die Größe eines std :: vectors reduziert seine Kapazität?
- 3. Swift init Array mit Kapazität
- 4. Wie kann die Code-Redundanz in Swift reduziert werden?
- 5. Kapazität eines uint64_t?
- 6. Parsen eines n-dimensionalen Arrays in swift
- 7. Sortieren eines Arrays von Arrays in Swift 3
- 8. Was ist der Unterschied zwischen den Methoden removeLast() und popLast() von Array in Swift?
- 9. Wie wird die Kapazität mit Trello verwaltet?
- 10. Entfernen von Duplikaten aus Arrays mit reduziert
- 11. Speichern eines Arrays mit Kerndaten Swift 3?
- 12. Swift - Sortieren einer Teilmenge eines Arrays
- 13. Vergleichen Sie Arrays in Swift
- 14. Sortieren eines Arrays von Wörterbuch (Swift)
- 15. Filtern eines Swift [AnyObject] Arrays nach Typ
- 16. Reduziert "readonly" (C#) die Speichernutzung?
- 17. Wie groß ist die Kapazität eines leeren Vektors?
- 18. Wie kann ich die aktuelle Kapazität eines C# -Dokuments ermitteln?
- 19. Die Kapazität einer Zeichenfolge erhöhen
- 20. Wie bekomme ich die Kapazität der ArrayList in Java?
- 21. Holen Sie den Inhalt eines Arrays von Etiketten in Swift
- 22. Parsen eines JSON-Arrays gibt leere Elemente in swift zurück
- 23. Deserialisieren eines JSON-Arrays in ein Swift-Array von Objekten
- 24. Stringbuffer Kapazität()
- 25. Wie verhalten sich die Slices, wenn sich ihre Kapazität verringert?
- 26. String Kapazität()
- 27. Ermitteln, ob ein Aufruf von `registerUserNotificationSettings` jemals in Swift
- 28. Überspringe Null-Arrays in Swift?
- 29. Zerstöre die Spielobjekte eines Arrays
- 30. Wie greife ich auf die nicht-die-ersten Elemente eines Arrays in Swift zu?