Die zugrunde liegende Implementierung von Unity List und die zugrunde liegende Implementierung einiger Methoden

Inhaltsverzeichnis

zugrunde liegende Implementierung

Gängige Methode

Vor-und Nachteile

        Vorteil

        Mangel

zugrunde liegende Implementierung

Der Listentyp von Unity verwendet einen zusammenhängenden Speicherblock, um Elemente zu speichern und über den Index des Arrays auf diese Elemente zuzugreifen und sie zu bearbeiten. Wenn wir der Liste Elemente hinzufügen und die aktuelle interne Array-Kapazität nicht ausreicht, um die neuen Elemente aufzunehmen, weist Unity automatisch einen größeren Speicherblock zu und kopiert die alten Elemente in den neuen Speicher. Dieser Vorgang wird als Erweiterung bezeichnet. Normalerweise verdoppelt Unity die Größe des internen Arrays bei jeder Erweiterung, um häufige Erweiterungsvorgänge zu reduzieren.

Gängige Methode

  • Add(item): Fügt ein Element am Ende der Liste hinzu. Reicht die aktuelle Kapazität nicht aus, um das neue Element aufzunehmen, wird ein Erweiterungsvorgang ausgelöst. Die zugrunde liegende Implementierung hängt neue Elemente an das Ende des internen Arrays an und aktualisiert die Länge der Liste.
  • Remove(item): Entfernen Sie das angegebene Element aus der Liste. Die zugrunde liegende Implementierung durchläuft die gesamte Liste, findet das erste passende Element und entfernt es. Diese Operation kann dazu führen, dass nachfolgende Elemente nach vorne verschoben werden, sodass die zeitliche Komplexität O(n) beträgt.
  • Insert(index, item): Fügt ein Element an der angegebenen Indexposition ein. Die zugrunde liegende Implementierung verschiebt das Element nach der Indexposition um ein Bit nach hinten, um Platz für das neue Element zu schaffen und es an der richtigen Position zu platzieren. Diese Operation kann dazu führen, dass nachfolgende Elemente nach hinten verschoben werden, sodass die zeitliche Komplexität O(n) beträgt.
  • Clear(): Alle Elemente in der Liste löschen. Die zugrunde liegende Implementierung setzt die Länge der Liste auf 0, gibt jedoch den Speicher des internen Arrays nicht frei.
  • Contains(item): Bestimmen Sie, ob die Liste das angegebene Element enthält. Die zugrunde liegende Implementierung durchläuft die gesamte Liste und vergleicht die Elemente nacheinander mit dem Zielelement. Die durchschnittliche zeitliche Komplexität dieser Operation beträgt O(n).
  • Find(Predicate<T> match): Suchen Sie das erste Element, das die Bedingung in der Liste gemäß der angegebenen Bedingung erfüllt, und geben Sie das Element zurück. Die zugrunde liegende Implementierung durchläuft die gesamte Liste und vergleicht Elemente und Bedingungen einzeln. Die durchschnittliche zeitliche Komplexität dieser Operation beträgt O(n).
  • FindAll(Predicate<T> match): Suchen Sie gemäß der angegebenen Bedingung alle Elemente in der Liste, die die Bedingung erfüllen, und geben Sie eine neue Liste zurück. Diese Operation durchläuft die gesamte Liste und vergleicht Elemente und Bedingungen einzeln. Die Zeitkomplexität beträgt O(n).
  • ForEach(Action<T> action): Führen Sie die angegebene Operation für jedes Element in der Liste aus. Die zugrunde liegende Implementierung verwendet eine einfache Schleife, um die Operationsfunktionen einzeln zu durchlaufen und anzuwenden.
  • RemoveAt(index): Entfernen Sie das Element an der angegebenen Indexposition. Die zugrunde liegende Implementierung verschiebt die Elemente nach dem Index um ein Bit nach vorne, überschreibt die Elemente, die gelöscht werden müssen, und aktualisiert die Länge der Liste. Diese Operation führt dazu, dass nachfolgende Elemente nach vorne verschoben werden, sodass die Zeitkomplexität O(n) beträgt.
  • ToArray(): Kopieren Sie die Elemente in der Liste in ein neues Array und geben Sie das Array zurück. Die zugrunde liegende Implementierung erstellt ein neues Array und kopiert die Elemente der Liste nacheinander in das neue Array.

Darüber hinaus bietet List einige Methoden zum Sortieren und Umkehren von Listen:

  • Sort(): Sortieren Sie die Elemente in der Liste. Unity verwendet den Schnellsortierungsalgorithmus, um diese Methode zu implementieren, die eine hohe Effizienz aufweist. Die zeitliche Komplexität der Sortierung beträgt O(n log n).
  • Reverse(): Kehrt die Reihenfolge der Elemente in der Liste um. Die zugrunde liegende Implementierung tauscht das erste Element mit dem letzten Element usw. aus, bis die gesamte Liste umgekehrt wurde.

Vor-und Nachteile

        Vorteil

  1. Dynamische Größenänderung: Die Liste kann automatisch erweitert werden und kann die Größe des internen Arrays nach Bedarf dynamisch anpassen, um das Hinzufügen oder Löschen von Elementen zu ermöglichen. Dadurch ist List flexibel und kann eine unbestimmte Anzahl von Elementen verarbeiten.

  2. Direkter Zugriff: Da die unterste Ebene mithilfe eines Arrays implementiert ist, unterstützt List den wahlfreien Zugriff über Indizes, d. h. auf Elemente an jeder Position kann direkt zugegriffen werden. Diese Direktzugriffsfunktion macht Lese- und Schreibvorgänge für Elemente mit einer Zeitkomplexität von O(1) sehr effizient.

  3. Lineare Iteration: Verwenden Sie die for-Schleife und andere Methoden, um eine lineare Iteration für die Liste durchzuführen und die darin enthaltenen Elemente zu durchlaufen. Diese iterative Methode ist relativ einfach und effizient.

        Mangel

  1. Das Einfügen und Löschen von Elementen ist ineffizient: Da die unterste Ebene ein kontinuierlicher Speicherblock ist, wird beim Einfügen oder Löschen eines Elements in der Mitte eine Reihe von Rückwärts- oder Vorwärtsoperationen der Elemente ausgelöst, was zu einer zeitlichen Komplexität von O führt (N). Daher können häufige Einfüge- und Löschvorgänge die Leistung beeinträchtigen.

  2. Speicheraufwand: Die Liste speichert Elemente in Form kontinuierlicher Arrays im Speicher. Wenn eine große Anzahl von Elementen gespeichert werden muss und nur ein kleiner Teil davon aktiv ist, kann dies zu einer gewissen Speicherverschwendung führen.

  3. Unterstützt keine schnelle Suche: Da List auf der Grundlage eines Arrays implementiert ist, bietet es keine schnelle Suchfunktion wie ein Wörterbuch (Dictionary). In Szenarien, die häufige Suchvorgänge erfordern, kann die Verwendung von List zu Leistungseinbußen führen.

Zusammenfassend lässt sich sagen, dass die Implementierung von List als dynamisches Array erhebliche Vorteile bei der Handhabung des Hinzufügens, Löschens und Direktzugriffs von Elementen bietet, jedoch möglicherweise einige Nachteile in Bezug auf häufige Einfüge- und Löschvorgänge und schnelle Suchanforderungen aufweist. Entsprechend den spezifischen Nutzungs- und Leistungsanforderungen können wir die geeignete Datenstruktur auswählen, um die Entwicklungsanforderungen zu erfüllen.

Acho que você gosta

Origin blog.csdn.net/qq_66312646/article/details/132087678
Recomendado
Clasificación