Lösungsvorschläge Blatt Nr. 1
Praktische Informatik 2 im SS 2005
Daten mit einer festen Länge von 120KB sollen in Dateien mit einer Blockgröße von
256KB gespeichert werden. Berechnen Sie die Blocknummer (page) und den Byte-Offset
innerhalb des Blocks (offset) des sechsten abgespeicherten Datensatzes
a) bei blockbezogener Datenorganisation
b) bei blocküergreifender Datenorganisation.
Hinweis: Die Nummerierung der Blöcke und Datensätze beginne bei 0.
Gegeben: Datensatzlänge
, Blocksatzgröße
Gesucht: Blocknummer und Byte-Offset des sechsten Datensatzes (
)
Es gilt
und
Es gilt
und
a) In eine Hashtabelle sollen ca. 5000 Datensätze eingefügt werden. Die Größe der
Hashtabelle wurde so gewählt, dass sie 5100 Datensätze aufnehmen kann. Wie
beurteilen Sie unter den genannten Voraussetzungen die Größe der Hashtabelle?
Was sollte man grundsätzlich bei der Verwendung einer Hashtabelle beachten?
b) Als Hashfunktion fürdie Hashtabelle aus Teilaufgabe a) wurde die Primzahl 5197
gewählt. Ist die Wahl dieser Primzahl günstig? Begründen Sie Ihre Antwort.
c) Gegeben sei nun eine Hashtabelle mit den Satznummern 0; : : : ; 4. Jeder Tabellenplatz
kann genau einen Datensatz aufnehmen. Sei
der Primärschlüssel eines
Datensatzes. Die Hashfunktion, die eine lineare Sondierfolge bei Kollision verwendet,
sei wie folgt vorgegeben:
Geben Sie die Belegung einer zu Anfang leeren Hashtabelle nach dem Einfügen
der Datensätze mit den Primärschlüsseln 40, 31, 56, 77, 41 an. Zeichnen Sie auch
die Verkettungen, die zum Auffinden der Datensätze nötig sind, in die Hashtabelle
ein.
Größe: 5100, Datensätze: 5000
Auslastung: 98%
es kommt zu einer sehr großen Anzahl von Kollisionen, d.h. Suchaufwand extrem hoch, im Worst-Case entartet die Hash-Tabelle also zu einer linearen Liste
lieber größere Tabelle wählen (z.B. 10000 Datensätze), dadurch zwar mehr Speicherverbrauch aber sehr viel effizienter.
Dann gilt
womit die Hashfunktion nicht für alle Primärschlüssel eine gültige Stelle findet.
Beim doppelten Hashing wird bei Kollisionen durch eine zweite Hashfunktion ein Offset
bestimmt, mit dem eine freie Stelle gesucht wird. Dies hat den Vorteil, dass Kollisionen
besser verteilt werden.
Folgende Hashfunktion realisiert doppeltes Hashing:
Geben Sie die Belegung einer zu Anfang leeren Hashtabelle nach dem Einfügen der
Datensätze mit den Primärschlüsseln 36, 20, 57, 10, 43, 14 an. Zeichnen Sie auch die
benötigten Verkettungen zum Auffinden der Datensätze in Ihre Hashtabelle ein.
 |
 |
 |
| 36 |
1 + 0*2 = 1 |
|
| 20 |
6 + 0*1 = 6 |
|
| 57 |
1 + 0*3 = 1 |
1 + 1*3 = 4 |
| 10 |
3 + 0*1 = 3 |
|
| 43 |
1 + 0*4 = 1 |
1 + 1*4 = 5 |
| 14 |
0 + 0*5 = 0 |
|
| 0 |
1 |
2 |
3 |
4 |
5 |
6 |
| 14 |
36 |
|
10 |
57 |
43 |
20 |
Dominik Brugger, Student der Universität Ulm, (2005-04-26)