Datenstrukturen und Algorithmen
Warum ist bei einer Hashtabelle mit vielen Elementen und einem Belegungsfaktor von etwa 0,5 die offene Adressierung mit linearem Sondieren am ehesten schneller als die Verkettung (Verbinden der Elemente durch verkettete Listen)?
- ANach einer Kollision wird als Nächstes das benachbarte Element geprüft, das oft in derselben oder der nächsten Cache-Line liegt; daher sind weniger Speicherzugriffe nötig
- BBei offener Adressierung treten überhaupt keine Kollisionen auf
- CBei Verkettung muss die Hashfunktion zweimal oder öfter berechnet werden
Antwort und Erläuterung anzeigen
Antwort: A. Nach einer Kollision wird als Nächstes das benachbarte Element geprüft, das oft in derselben oder der nächsten Cache-Line liegt; daher sind weniger Speicherzugriffe nötig
Auf heutigen CPUs dauert das Lesen aus dem Hauptspeicher nach einem Cache-Miss weit länger als Berechnungen wie Vergleiche. Lineares Sondieren prüft nach einer Kollision die Nachbarposition, sodass die meisten Sondierschritte in derselben Cache-Line bleiben, und auch das Prefetching hilft. Bei der Verkettung liegt das nächste Element einer Liste oft an einer anderen Stelle im Speicher, sodass jeder verfolgte Zeiger leicht einen Cache-Miss auslöst. Selbst bei gleicher Komplexität in O-Notation kann die tatsächliche Geschwindigkeit je nach Art des Speicherzugriffs stark abweichen. Lineares Sondieren wird allerdings bei hohem Belegungsfaktor stark langsamer, weil sich die belegten Positionen zusammenballen; der Belegungsfaktor wird daher eher niedrig gehalten.