Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:adt:set:implementationen:start [14.11.2021 18:17] – [Variante 3: Hashtable] sbel | faecher:informatik:oberstufe:adt:set:implementationen:start [14.11.2021 18:42] (aktuell) – [Ist eine Zahl in der Menge enthalten?] sbel | ||
---|---|---|---|
Zeile 37: | Zeile 37: | ||
</ | </ | ||
- | {{ : | + | {{ : |
Der binäre UND-Operator verknüpft zwei '' | Der binäre UND-Operator verknüpft zwei '' | ||
Zeile 52: | Zeile 52: | ||
| | ||
</ | </ | ||
- | {{ : | + | {{ : |
Der binäre ODER-Operator verknüpft zwei '' | Der binäre ODER-Operator verknüpft zwei '' | ||
Zeile 76: | Zeile 76: | ||
</ | </ | ||
- | {{ : | + | {{ : |
==== Zahlbereichserweiterung ==== | ==== Zahlbereichserweiterung ==== | ||
Zeile 84: | Zeile 84: | ||
Die k-te Zahl der ArrayList repräsentiert damit die Elemente mit den Werten 32·k bis 32·k+31. | Die k-te Zahl der ArrayList repräsentiert damit die Elemente mit den Werten 32·k bis 32·k+31. | ||
- | {{ : | + | {{ : |
Das Element '' | Das Element '' | ||
Zeile 157: | Zeile 157: | ||
</ | </ | ||
+ | ==== Kollisionen ==== | ||
+ | |||
+ | "Aber was macht man, wenn zwei Zahlen den gleichen Hashwert erhalten?" | ||
+ | |||
+ | Wenn zwei unterschiedliche Zahlen den gleichen Hashwert bekommen, spricht man von einer **Kollision**. Kollisionen sind bei Hashfunktionen unvermeidlich, | ||
+ | |||
+ | Im Beispiel würde die Zahl '' | ||
+ | |||
+ | Eine Möglichkeit ist, dass man an einer Stelle im Array nicht nur eine einzelne Zahl speichert, sondern mehrere (einen " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Wenn man bestimmen will, ob ein Wert '' | ||
+ | |||
+ | * Bestimme den Index von x (z.B. '' | ||
+ | * Untersuche alle Werte in diesem Behälter. Wenn einer davon gleich '' | ||
+ | |||
+ | Ein Behälter kann z.B. mit einer '' | ||
+ | |||
+ | Der Speicheraufwand ist etwas höher und auch das Durchsuchen der Behälter dauert etwas länger. | ||
+ | |||
+ | "Aber was haben wir damit jetzt gewonnen? Wir müssen immer noch die Behälter komplett durchsuchen!" | ||
+ | |||
+ | Das stimmt, allerdings ist es sehr unwahrscheinlich, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Zudem kann man mit **Rehashing** die Elemente neu verteilen, wenn die Auslastung einen bestimmten Grenzwert (z.B. 75%) überschreitet. | ||
+ | |||
+ | Die Auslastung bezeichnet das Verhältnis der gespeicherten Werte zur Länge des Arrays. \\ Im Beispiel: 8 Elemente, 10 Plätze → Auslastung = 80% | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Man legt ein neues Array der Länge z.B. 21 an und sortiert die bestehenden Werte neu ein. Viele der Kollisionen treten jetzt nicht mehr auf, es können aber neue Kollisionen entstehen, die Behälter enthalten jetzt im Durchschnitt weniger als einen Wert. | ||
+ | |||
+ | Die Rehashing-Operation ist sehr zeitaufwendig, | ||
+ | Im Durchschnitt ist der lesende und schreibende Zugriff auf die Werte in konstanter Zeit möglich, also unabhängig von der Anzahl der Elemente im Set. | ||
+ | |||
+ | Wenn man im Vorfeld bereits weiß, wie viele Elemente vermutlich gespeichert werden sollen, kann man bereits beim Erzeugen das Array entsprechend anlegen. | ||
+ | |||
+ | ==== Bewertung ==== | ||
+ | |||
+ | |||
+ | === Vorteile: === | ||
+ | |||
+ | * Im Durchschnitt sehr schnell | ||
+ | * Auf beliebige Datentypen anwendbar (in Java: Methode '' | ||
+ | |||
+ | === Nachteile: === | ||
+ | |||
+ | * Hoher Speicherbedarf | ||
+ | * Kann in seltenen (konstruierten) Fällen langsam arbeiten |