Datenstrukturen: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 248: Zeile 248:


== Laufzeiten nach eigenen Tests in ms ==
== Laufzeiten nach eigenen Tests in ms ==
Alle Eigenschaften und Bemerkungen aus der vorherigen Sektion gelten auch hier.
Der Quellcode des für die Tests verwendeten Miniprogramms kann [[DatenstrukturenSpeedTest|hier]] eingesehen werden.
Der Quellcode des für die Tests verwendeten Miniprogramms kann [[DatenstrukturenSpeedTest|hier]] eingesehen werden.


Zeile 271: Zeile 273:
! Clear
! Clear
   
   
! Count
! Count  
 
! Element-Typ
! [[ThreadSafety|Thread-safe]]
! Bemerkungen
|-
|-
! [http://msdn.microsoft.com/en-us/library/bb359438.aspx HashSet<T>]
! [http://msdn.microsoft.com/en-us/library/bb359438.aspx HashSet<T>]
Zeile 291: Zeile 288:
| O(n)
| O(n)
   
   
| O(1)
| class="close" | O(1)
   
   
| T
| Nein
| class="close" | keine Duplikate<br>
|-
|-
! [http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx LinkedList&lt;T&gt;]
! [http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx LinkedList&lt;T&gt;]
Zeile 311: Zeile 303:
| O(n)
| O(n)
   
   
| O(1)
| class="close" | O(1)
   
   
| T
| Nein
| class="close" |
|-
|-
! [http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx List&lt;T&gt;]
! [http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx List&lt;T&gt;]
Zeile 331: Zeile 318:
| O(n)
| O(n)
   
   
| O(1)
| class="close" | O(1)
 
| T
| Nein
| class="close" |  
|-
|-
! [http://msdn.microsoft.com/en-us/library/7977ey2c.aspx Queue&lt;T&gt;]
! [http://msdn.microsoft.com/en-us/library/7977ey2c.aspx Queue&lt;T&gt;]
Zeile 351: Zeile 333:
| O(n)<br>
| O(n)<br>
   
   
| O(1)<br>
| class="close" | O(1)<br>
| T<br>
| Nein<br>
| class="close" |
Remove und Add sind Deqeue und Enqueue


|-
|-
Zeile 374: Zeile 348:
| O(n)<br>
| O(n)<br>
   
   
| O(1)<br>
| class="close" | O(1)<br>  
 
| T<br>
| Nein<br>
| class="close" | Remove und Add sind Pop und Push<br>
|-
|-
! [http://msdn.microsoft.com/en-us/library/ms668265.aspx SynchronizedCollection&lt;T&gt;]
! [http://msdn.microsoft.com/en-us/library/ms668265.aspx SynchronizedCollection&lt;T&gt;]
Zeile 394: Zeile 363:
| O(n)<br>
| O(n)<br>
   
   
| O(1)<br>
| class="close" | O(1)<br>
| T<br>
| Ja<br>
| class="close" |  
benutzt intern List&lt;T&gt;, hat aber zusätzliche Mechanismen<br>um [[ThreadSafety|Thread-safety]] zu garantieren


|}
|}
Zeile 420: Zeile 381:
! Clear  
! Clear  
! Count  
! Count  
! Element-Typ
! [[ThreadSafety|Thread-safe]]
! Bemerkungen
|-
|-
! [http://msdn.microsoft.com/en-us/library/xfhwa508.aspx Dictionary&lt;TKey, TValue&gt;]  
! [http://msdn.microsoft.com/en-us/library/xfhwa508.aspx Dictionary&lt;TKey, TValue&gt;]  
Zeile 429: Zeile 387:
| O(1)  
| O(1)  
| O(n)  
| O(n)  
| O(1)
| class="close" | O(1)
| [http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx KeyValuePair<TKey,TValue>]
| Nein
| class="close" | Verfügt über [[TryGetValue]]-Methode
|-
|-
! [http://msdn.microsoft.com/en-us/library/f7fta44c.aspx SortedDictionary&lt;TKey, TValue&gt;]
! [http://msdn.microsoft.com/en-us/library/f7fta44c.aspx SortedDictionary&lt;TKey, TValue&gt;]
Zeile 439: Zeile 394:
| O(log n)  
| O(log n)  
| O(n)  
| O(n)  
| O(1)
| class="close" | O(1)
| [http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx KeyValuePair<TKey,TValue>]
| Nein
| class="close" | Verfügt über [[TryGetValue]]-Methode<br>schneller als SortedList bei unsortierten Daten
|-
|-
! [http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx Hashtable]  
! [http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx Hashtable]  
Zeile 449: Zeile 401:
| O(1)
| O(1)
| O(n)  
| O(n)  
| O(1)
| class="close" | O(1)
| [http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx KeyValuePair<object,object>]<br>oder<br>[http://msdn.microsoft.com/en-us/library/system.collections.dictionaryentry.aspx DictionaryEntry]
| Read-Only mit einem schreibenden Thread
| class="close" | Die initiale Capacity der Hashtable kann im [[Konstruktor]] angegeben werden: [http://msdn.microsoft.com/en-us/library/k3x9ky40.aspx <tt>Hashtable(Int32)</tt>]
|-
|-
! [http://msdn.microsoft.com/en-us/library/ms132319.aspx SortedList&lt;TKey, TValue&gt;]
! [http://msdn.microsoft.com/en-us/library/ms132319.aspx SortedList&lt;TKey, TValue&gt;]
Zeile 459: Zeile 408:
| O(log n)
| O(log n)
| O(n)
| O(n)
| O(1)
| class="close" | O(1)
| [http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx KeyValuePair<TKey,TValue>]
| Nein
| class="close" | Verfügt über [[TryGetValue]]-Methode<br>schneller als SortedDictionary bei vorsortierten Daten
|} [[Kategorie:Code-Beispiele]]
|} [[Kategorie:Code-Beispiele]]


== Referenzen ==
== Referenzen ==

Version vom 19. April 2009, 19:14 Uhr



Hinweise

  • Falls nicht anders angegeben sind Laufzeiten immer Average Case.
  • Alle Links zu den Datenstrukturen zeigen auf die englische Version der MSDN. Diese ist typischerweise vollständiger und genauer als ihre deutsche Übersetzung.
  • Die meisten der hier vorgestellten Datenstrukturen (alle außer Hashtable) sind Generics. Ihre Verwendung wird im Generic-Artikel erklärt.
  • n entspricht immer dem Count der Datenstruktur, d.h. der Anzahl an Elementen in der Struktur.
  • Mit Element-Typ wird hier der Wert bezeichnet, den der Enumerator bei einer Foreach-Anweisung zurückgibt.
  • ElementAt ist eine spezielle Extension Method. Bei Strukturen die das Interface IList<T> implementieren gibt sie das Element an der angegebenen Position an, ansonsten iteriert sie so oft wie angegeben und gibt das Element an dieser Stelle zurück. [1]
  • Datenstrukturen die auf Arrays basieren besitzen intern eine Capacity. Diese gibt die aktuelle Größe des internen Arrays an. Capacity ist immer größer bzw. gleich Count. Sollte beim Hinzufügen eines Elements die Capacity der Struktur überschritten werden, muss diese wachsen. Dazu erzeugt sie intern einen neuen, größeren Array und kopiert alle bis dahin vorhandenen Einträge in diesen neuen Array. Typischerweise ist die neue Größe des Arrays die erste Primzahl, die größer als das Doppelte der alten Capacity ist.

Laufzeiten und Eigenschaften (nach MSDN)

ein-elementige Datenstrukturen


Laufzeiten

Add Remove ElementAt Contains Clear Count Element-Typ Thread-safe Bemerkungen
HashSet<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(n) O(1) O(n) O(1) T Nein keine Duplikate
LinkedList<T> O(1) O(1) O(n) O(n) O(n) O(1) T Nein
List<T> O(1)
O(n) wenn Count + 1 > Capacity
O(n) O(1) O(n) O(n) O(1) T Nein
Queue<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1)
O(n)
O(n)
O(n)
O(1)
T
Nein

Remove und Add sind Deqeue und Enqueue


Stack<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1)
O(n)
O(n)
O(n)
O(1)
T
Nein
Remove und Add sind Pop und Push
SynchronizedCollection<T> O(1)
O(n) wenn Count + 1 > Capacity
O(n)
O(1)
O(n)
O(n)
O(1)
T
Ja

benutzt intern List<T>, hat aber zusätzliche Mechanismen
um Thread-safety zu garantieren


zwei-elementige Datenstrukturen

Alle Datenstrukturen in dieser Liste haben folgendes gemeinsam:

  • Keys müssen eindeutig sein.
  • Keys dürfen nicht von "außen" verändert werden (immutable).
  • Die Add-Methode wirft eine Exception wenn der Key bereits vorhanden ist.
  • Die Values können über die Item-Property der Datenstruktur angesprochen werden:
    myDataStructure[key] = expression;
    
    Dabei wird ein Wert
    • wenn der Key bereits vorhanden ist überschrieben
    • wenn der Key noch nicht vorhanden ist neu angelegt.
  • Sie implementieren das IDictionary-Interface.
  • Die Laufzeit für ElementAt ist für alle außer Hashtable O(n). Hashtable unterstützt diese Methode nicht.

Außerdem sortieren sowohl SortedDictionary<TKey,TValue> als auch SortedList<TKey,TValue> ihren Inhalt beim einfügen, d.h. wenn man mit einer foreach-Anweisung (o.ä.) über sie iteriert, erhält man die Elemente geordnet zurück. Dabei wird die Ordnung durch den beim Erzeugen angegebenen Comparer bestimmt. Wird kein spezieller Comparer angegeben, verwenden sie einen Standard-Comparer für TKey, der das Interface IComparer<T> erfüllt.


Laufzeiten
Add Remove ContainsKey Clear Count Element-Typ Thread-safe Bemerkungen
Dictionary<TKey, TValue> O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(1) O(n) O(1) KeyValuePair<TKey,TValue> Nein Verfügt über TryGetValue-Methode
SortedDictionary<TKey, TValue> O(log n) O(log n) O(log n) O(n) O(1) KeyValuePair<TKey,TValue> Nein Verfügt über TryGetValue-Methode
schneller als SortedList bei unsortierten Daten
Hashtable O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(1) O(n) O(1) KeyValuePair<object,object>
oder
DictionaryEntry
Read-Only mit einem schreibenden Thread Die initiale Capacity der Hashtable kann im Konstruktor angegeben werden: Hashtable(Int32)
SortedList<TKey, TValue> O(n) O(n) O(log n) O(n) O(1) KeyValuePair<TKey,TValue> Nein Verfügt über TryGetValue-Methode
schneller als SortedDictionary bei vorsortierten Daten

Laufzeiten nach eigenen Tests in ms

Alle Eigenschaften und Bemerkungen aus der vorherigen Sektion gelten auch hier.

Der Quellcode des für die Tests verwendeten Miniprogramms kann hier eingesehen werden.

ein-elementige Datenstrukturen


Laufzeiten

Add Remove ElementAt Contains Clear Count
HashSet<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(n) O(1) O(n) O(1)
LinkedList<T> O(1) O(1) O(n) O(n) O(n) O(1)
List<T> O(1)
O(n) wenn Count + 1 > Capacity
O(n) O(1) O(n) O(n) O(1)
Queue<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1)
O(n)
O(n)
O(n)
O(1)
Stack<T> O(1)
O(n) wenn Count + 1 > Capacity
O(1)
O(n)
O(n)
O(n)
O(1)
SynchronizedCollection<T> O(1)
O(n) wenn Count + 1 > Capacity
O(n)
O(1)
O(n)
O(n)
O(1)

zwei-elementige Datenstrukturen

Laufzeiten
Add Remove ContainsKey Clear Count
Dictionary<TKey, TValue> O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(1) O(n) O(1)
SortedDictionary<TKey, TValue> O(log n) O(log n) O(log n) O(n) O(1)
Hashtable O(1)
O(n) wenn Count + 1 > Capacity
O(1) O(1) O(n) O(1)
SortedList<TKey, TValue> O(n) O(n) O(log n) O(n) O(1)

Referenzen