Datenstrukturen: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
Dietsch (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Dietsch (Diskussion | Beiträge)
Zeile 165: Zeile 165:
|}
|}


=== zwei-elementige Datenstrukturen ===
<h3> zwei-elementige Datenstrukturen </h3>
<p>Alle Datenstrukturen in dieser Liste haben folgendes gemeinsam:
</p><p><br />
</p>
<ul><li>Keys müssen eindeutig sein.
</li></ul>
<ul><li>Die Add-Methode wirft eine Exception wenn der Key bereits vorhanden ist.
</li></ul>
<ul><li>Die Values können über die <a href="http://msdn.microsoft.com/en-us/library/9tee9ht2.aspx">Item-Property</a> der Datenstruktur angesprochen werden:<br /><span class="fck_mw_source" _fck_mw_customtag="true" _fck_mw_tagname="source" lang="csharp">myDataStructure[key] = expression;</span>Dabei wird ein Wert
</li></ul>
<ul><li><ul><li>wenn der Key bereits vorhanden ist überschrieben
</li></ul>
</li></ul>
<ul><li><ul><li>wenn der Key noch nicht vorhanden ist neu angelegt.
</li></ul>
</li></ul>
<ul><li>Sie implementieren das <a href="http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx">IDictionary</a>-Interface.
</li></ul>
<p><br />
</p><p><br />
</p>
<table class="default">


{| class="default"
<tr>
|-
<td class="blank"> <br />
| class="blank" | <br>
</td><th colspan="6"> Laufzeiten von Methoden
! colspan="6" | Laufzeiten von Methoden
</th><td class="blank"> <br />
| class="blank" | <br>
</td></tr>
|-
<tr>
| class="blank" | <br>
<td class="blank"> <br />
! Add
</td><th> Add
! Remove
</th><th> Remove
! ElementAt
</th><th> ElementAt
! Contains
</th><th> Contains
! Clear
</th><th> Clear
! Count
</th><th> Count
! Element-Typ
</th><th> Element-Typ
! [[ThreadSafety|Thread-safe]]
</th><th> <a href="ThreadSafety">Thread-safe</a>
! Bemerkungen
</th><th> Bemerkungen
|-
</th></tr>
! [http://msdn.microsoft.com/en-us/library/xfhwa508.aspx Dictionary&lt;TKey, TValue&gt;]
<tr>
| O(1)<br>O(n) wenn Count + 1 &gt; Capacity<br>
<th> <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary&lt;TKey, TValue&gt;</a>
| O(1)<br>
</th><td> O(1)<br />O(n) wenn Count + 1 &gt; Capacity<br />
| <br>
</td><td> O(1)<br />
| O(1)<br>
</td><td> <br />
| <br>
</td><td> O(1)<br />
| <br>
</td><td> <br />
| <br>
</td><td> O(1)<br />
| Nein<br>
</td><td> <a href="http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx">KeyValuePair&lt;TKey,TValue&gt;</a><br />
| class="close" | <br>
</td><td> Nein<br />
|-
</td><td class="close">
! [http://msdn.microsoft.com/en-us/library/f7fta44c.aspx SortedDictionary&lt;TKey, TValue&gt;]
<p>Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode<br />
| O(log n)<br>
</p><p><br />
| O(log n)<br>
</p>
| <br>
</td></tr>
| O(log n)<br>
<tr>
| <br>
<th> <a href="http://msdn.microsoft.com/en-us/library/f7fta44c.aspx">SortedDictionary&lt;TKey, TValue&gt;</a>
| <br>
</th><td> O(log n)<br />
| <br>
</td><td> O(log n)<br />
| Nein<br>
</td><td> <br />
| class="close" | schneller als SortedList bei unsortierten Daten<br>
</td><td> O(log n)<br />
|-
</td><td> <br />
! [http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx Hashtable]
</td><td> <br />
| <br>
</td><td> <br />
| <br>
</td><td> Nein<br />
| <br>
</td><td class="close">
| <br>
<p>Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode
| <br>
</p><p>schneller als SortedList bei unsortierten Daten<br />
| <br>
</p><p><br />
| <br>
</p>
| Read-Only mit einem schreibenden Thread<br>
</td></tr>
| class="close" | <br>
<tr>
|-
<th> <a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx">Hashtable</a>
! [http://msdn.microsoft.com/en-us/library/ms132319.aspx SortedList&lt;TKey, TValue&gt;]
</th><td> <br />
| O(n)<br>
</td><td> <br />
| O(n)<br>
</td><td> <br />
| <br>
</td><td> <br />
| O(log n)<br>
</td><td> <br />
| <br>
</td><td> <br />
| <br>
</td><td> <br />
| <br>
</td><td> Read-Only mit einem schreibenden Thread<br />
| Nein<br>
</td><td class="close">
| class="close" | schneller als SortedDictionary bei vorsortierten Daten<br>
<p><br />
|}
</p><p><br />
</p>
</td></tr>
<tr>
<th> <a href="http://msdn.microsoft.com/en-us/library/ms132319.aspx">SortedList&lt;TKey, TValue&gt;</a>
</th><td> O(n)<br />
</td><td> O(n)<br />
</td><td> <br />
</td><td> O(log n)<br />
</td><td> <br />
</td><td> <br />
</td><td> <br />
</td><td> Nein
</td><td class="close">
<p>Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode
</p><p>schneller als SortedDictionary bei vorsortierten Daten<br />
</p><p><br />
</p>
</td></tr></table>


== Referenzen ==
== Referenzen ==

Version vom 19. April 2009, 16:31 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.
  • Die Add-Methode wirft eine Exception wenn der Key bereits vorhanden ist.
    • wenn der Key bereits vorhanden ist überschrieben
    • wenn der Key noch nicht vorhanden ist neu angelegt.




Laufzeiten von Methoden

Add Remove ElementAt Contains Clear Count Element-Typ <a href="ThreadSafety">Thread-safe</a> Bemerkungen
<a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary<TKey, TValue></a> O(1)
O(n) wenn Count + 1 > Capacity
O(1)

O(1)

O(1)
<a href="http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx">KeyValuePair<TKey,TValue></a>
Nein

Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode


<a href="http://msdn.microsoft.com/en-us/library/f7fta44c.aspx">SortedDictionary<TKey, TValue></a> O(log n)
O(log n)

O(log n)



Nein

Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode

schneller als SortedList bei unsortierten Daten


<a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx">Hashtable</a>






Read-Only mit einem schreibenden Thread



<a href="http://msdn.microsoft.com/en-us/library/ms132319.aspx">SortedList<TKey, TValue></a> O(n)
O(n)

O(log n)



Nein

Verfügt über <a _fcknotitle="true" href="TryGetValue">TryGetValue</a>-Methode

schneller als SortedDictionary bei vorsortierten Daten


Referenzen