Hash-Tabelle in Datenstruktur: Python Beispiel

Was ist Hashing?

Ein Hash ist ein Wert mit fester Lรคnge, der mithilfe einer mathematischen Formel generiert wird. Hash-Werte werden bei der Datenkomprimierung, Kryptologie usw. verwendet. Bei der Datenindizierung werden Hash-Werte verwendet, weil sie unabhรคngig von den Werten, die zu ihrer Generierung verwendet wurden, eine feste Lรคnge haben. Dadurch nehmen Hash-Werte im Vergleich zu anderen Werten unterschiedlicher Lรคnge nur minimalen Platz ein.

Eine Hash-Funktion verwendet einen mathematischen Algorithmus, um den Schlรผssel in einen Hash umzuwandeln. Eine Kollision tritt auf, wenn eine Hash-Funktion fรผr mehr als einen Schlรผssel denselben Hashwert erzeugt.

Was ist eine Hash-Tabelle?

A HASH-TABELLE ist eine Datenstruktur, die Werte mithilfe eines Schlรผssel-Wert-Paares speichert. Jedem Wert ist ein eindeutiger Schlรผssel zugeordnet, der mithilfe einer Hash-Funktion generiert wird.

Der Name des Schlรผssels wird verwendet, um auf den zugehรถrigen Wert zuzugreifen. Dadurch wird die Suche nach Werten in einer Hash-Tabelle sehr schnell, unabhรคngig von der Anzahl der Elemente in der Hash-Tabelle.

Hash-Funktionen

Wenn wir beispielsweise Mitarbeiterdaten speichern mรถchten und jeder Mitarbeiter anhand einer Mitarbeiternummer eindeutig identifiziert wird.

Wir kรถnnen die Mitarbeiternummer als Schlรผssel verwenden und die Mitarbeiterdaten als Wert zuweisen.

Der obige Ansatz erfordert zusรคtzlichen freien Speicherplatz in der GrรถรŸenordnung von (m * n2) wobei die Variable m die GrรถรŸe des ist Array, und die Variable n ist die Anzahl der Stellen fรผr die Mitarbeiternummer. Dieser Ansatz fรผhrt zu einem Speicherplatzproblem.

Eine Hash-Funktion lรถst das obige Problem, indem sie die Mitarbeiternummer abruft und daraus einen Hash-Ganzzahlwert, feste Ziffern und eine Optimierung des Speicherplatzes generiert. Der Zweck einer Hash-Funktion besteht darin, einen Schlรผssel zu erstellen, der als Referenz auf den Wert verwendet wird, den wir speichern mรถchten. Die Funktion akzeptiert den zu speichernden Wert und berechnet dann mithilfe eines Algorithmus den Wert des Schlรผssels.

Das Folgende ist ein Beispiel fรผr eine einfache Hash-Funktion

h(k) = k1 % m

HIER,

  • h(k) ist die Hash-Funktion, die einen Parameter k akzeptiert. Der Parameter k ist der Wert, fรผr den wir den Schlรผssel berechnen mรถchten.
  • k1 % m ist der Algorithmus fรผr unsere Hash-Funktion, wobei k1 der Wert ist, den wir speichern mรถchten, und m die GrรถรŸe der Liste. Wir verwenden den Modulo-Operator, um den Schlรผssel zu berechnen.

Beispiel

Nehmen wir an, wir haben eine Liste mit einer festen GrรถรŸe von 3 und den folgenden Werten

[1,2,3].

Mit der obigen Formel kรถnnen wir die Positionen berechnen, die jeder Wert einnehmen sollte.

Das folgende Bild zeigt die verfรผgbaren Indizes in unserer Hash-Tabelle.

Hash-Funktionen

Schritt 1) Berechnen Sie auf diese Weise die Position, die der erste Wert einnehmen wird

h(1) = 1 % 3

= 1

Die Wertschรถpfung 1 wird besetzen der Raum auf Index 1

Schritt 2) Berechnen Sie die Position, die der zweite Wert einnehmen wird

h(2) = 2 % 3

= 2

Die Wertschรถpfung 2 wird besetzen der Raum auf Index 2

Schritt 3) Berechnen Sie die Position, die der dritte Wert einnehmen wird.

h(3) = 3 % 3

= 0

Die Wertschรถpfung 3 wird besetzen der Raum auf Index 0

Endergebnis

Unsere ausgefรผllte Hash-Tabelle sieht nun wie folgt aus.

Hash-Funktionen

Eigenschaften einer guten Hash-Funktion

Eine gute Hash-Funktion sollte die folgenden Eigenschaften haben.

  • Die Formel zum Generieren des Hashs sollte den im Algorithmus zu speichernden Datenwert verwenden.
  • Die Hash-Funktion sollte auch fรผr gleich groรŸe Eingabedaten eindeutige Hash-Werte generieren.
  • Die Funktion soll die Anzahl der Kollisionen minimieren. Kollisionen treten auf, wenn derselbe Wert fรผr mehr als einen Wert generiert wird.
  • Die Werte mรผssen konsistent รผber alle mรถglichen Hashes verteilt sein.

Kollision

Eine Kollision tritt auf, wenn der Algorithmus denselben Hash fรผr mehr als einen Wert generiert.

Schauen wir uns ein Beispiel an.

Angenommen, wir haben die folgende Werteliste

[3,2,9,11,7].

Nehmen wir an, dass die GrรถรŸe der Hash-Tabelle 7 betrรคgt, und verwenden wir die Formel (k1 % m), wobei m die GrรถรŸe der Hash-Tabelle ist.

Die folgende Tabelle zeigt die generierten Hashwerte.

Wesentliche Hash-Algorithmus (k1 % m) Hashwert
3 3% 7 3
2 3% 7 2
9 3% 7 2
11 3% 7 4
7 3% 7 0

Wie wir aus den obigen Ergebnissen sehen kรถnnen, haben die Werte 2 und 9 den gleichen Hashwert und wir kรถnnen nicht mehr als einen Wert an jeder Position speichern.

Das gegebene Problem kann entweder durch Verkettung oder durch Sondierung gelรถst werden. In den folgenden Abschnitten werden Verkettung und Sondierung im Detail erlรคutert.

Verkettung

Die Verkettung ist eine Technik, die zur Lรถsung des Kollisionsproblems verwendet wird, indem verknรผpfte Listen verwendet werden, die jeweils รผber eindeutige Indizes verfรผgen.

Das folgende Bild veranschaulicht, wie eine verkettete Liste aussieht

Verkettung

Sowohl 2 als auch 9 belegen denselben Index, werden jedoch als verknรผpfte Listen gespeichert. Jede Liste hat eine eindeutige Kennung.

Vorteile verketteter Listen

Die Vorteile verketteter Listen sind folgende:

  • Verkettete Listen weisen beim Einfรผgen von Daten eine bessere Leistung auf, da die Einfรผgereihenfolge O(1) ist.
  • Es ist nicht erforderlich, die GrรถรŸe einer Hash-Tabelle zu รคndern, die eine verkettete Liste verwendet.
  • Es kann problemlos eine groรŸe Anzahl von Werten aufnehmen, solange freier Speicherplatz verfรผgbar ist.

Sondierung

Die andere Technik, die zur Lรถsung von Kollisionen verwendet wird, ist die Sondierung. Wenn es bei der Sondierungsmethode zu einer Kollision kommt, kรถnnen wir einfach weitermachen und einen leeren Steckplatz finden, um unseren Wert zu speichern.

Die folgenden Sondierungsmethoden sind verfรผgbar:

Methodik Beschreibung
Lineares Antasten Wie der Name schon sagt, sucht diese Methode linear nach leeren Slots, beginnend an der Position, an der die Kollision stattgefunden hat, und bewegt sich vorwรคrts. Wenn das Ende der Liste erreicht ist und kein leerer Slot gefunden wird. Die Sondierung beginnt am Anfang der Liste.
Quadratische Prรผfung Diese Methode verwendet quadratische Polynomausdrรผcke, um den nรคchsten verfรผgbaren freien Slot zu finden.
Double Hashing Diese Technik verwendet einen sekundรคren Hash-Funktionsalgorithmus, um den nรคchsten freien verfรผgbaren Steckplatz zu finden.

Unter Verwendung unseres obigen Beispiels wรผrde die Hash-Tabelle nach der Verwendung von Sondierung wie folgt aussehen:

Sondierung

Hashtabellenoperationen

Hier sind die OperaVon Hash-Tabellen unterstรผtzte Funktionen:

  • Einfรผgen - Dies OperaMit der Funktion wird ein Element zur Hash-Tabelle hinzugefรผgt
  • Suchen - Dies OperaMit der Funktion wird mithilfe des Schlรผssels nach Elementen in der Hash-Tabelle gesucht
  • Lรถschen - Dies OperaMit dieser Funktion werden Elemente aus der Hash-Tabelle gelรถscht

Daten einfรผgen

Der Einfรผgevorgang wird verwendet, um Werte in der Hash-Tabelle zu speichern. Wenn ein neuer Wert in der Hash-Tabelle gespeichert wird, wird ihm eine Indexnummer zugewiesen. Die Indexnummer wird mithilfe der Hash-Funktion berechnet. Die Hash-Funktion lรถst alle Kollisionen, die bei der Berechnung der Indexnummer auftreten.

Suchen nach Datenoperation

Die Suchoperation wird verwendet, um Werte in der Hash-Tabelle anhand der Indexnummer nachzuschlagen. Die Suchoperation gibt den Wert zurรผck, der mit der Suchindexnummer verknรผpft ist. Wenn wir beispielsweise den Wert 6 bei Index 2 speichern, gibt die Suchoperation mit Indexnummer 2 den Wert 6 zurรผck.

Datenlรถschvorgang

Mit der Lรถschoperation wird ein Wert aus einer Hash-Tabelle entfernt. Zum Lรถschen des OperaDie Einfรผgen-Operation erfolgt รผber die Indexnummer. Sobald ein Wert gelรถscht wurde, wird die Indexnummer freigegeben. Sie kann รผber die Einfรผgeoperation zum Speichern anderer Werte verwendet werden.

Hash-Tabellen-Implementierung mit Python Beispiel

Schauen wir uns ein einfaches Beispiel an, das den Hashwert eines Schlรผssels berechnet

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Erklรคrung des Hash-Tabellencodes

Erklรคrung des Hash-Tabellencodes

HIER,

  1. Definiert eine Funktion hash_key, die die Parameter key und m akzeptiert.
  2. Verwendet eine einfache Modulo-Operation zur Ermittlung des Hash-Wertes
  3. Definiert eine Variable m, die auf den Wert 7 initialisiert wird. Dies ist die GrรถรŸe unserer Hash-Tabelle
  4. Berechnet den Hashwert von 3 und gibt ihn aus
  5. Berechnet den Hashwert von 2 und gibt ihn aus
  6. Berechnet den Hashwert von 9 und gibt ihn aus
  7. Berechnet den Hashwert von 11 und gibt ihn aus
  8. Berechnet den Hashwert von 7 und gibt ihn aus

Die Ausfรผhrung des obigen Codes erzeugt die folgenden Ergebnisse.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Wรถrterbuchbeispiel

Python verfรผgt รผber einen integrierten Datentyp namens Dictionary. Ein Wรถrterbuch ist ein Beispiel fรผr eine Hash-Tabelle. Es speichert Werte mithilfe eines Schlรผssel-Wert-Paares. Die Hashwerte werden automatisch fรผr uns generiert und eventuelle Kollisionen werden im Hintergrund fรผr uns aufgelรถst.

Das folgende Beispiel zeigt, wie Sie einen Dictionary-Datentyp verwenden kรถnnen in Python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Wรถrterbuchbeispiel

HIER,

  1. Definiert einen Mitarbeiter mit Wรถrterbuchvariablen. Der Schlรผsselname wird verwendet, um den Wert โ€žJohn Doeโ€œ zu speichern, โ€žageโ€œ speichert โ€ž36โ€œ und โ€žpositionโ€œ speichert den Wert โ€žBusiness Managerโ€œ.
  2. Ruft den Wert des Schlรผsselnamens ab und gibt ihn im Terminal aus
  3. Aktualisiert den Wert der Schlรผsselposition auf den Wert Software Engineer
  4. Druckt die Werte des Schlรผsselnamens und der Schlรผsselposition
  5. Lรถscht alle Werte, die in unserer Wรถrterbuchvariablen โ€žmitarbeiterโ€œ gespeichert sind
  6. Druckt den Wert des Mitarbeiters

Das Ausfรผhren des obigen Codes erzeugt die folgenden Ergebnisse.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Komplexitรคtsanalyse

Hash-Tabellen haben im besten Fall eine durchschnittliche Zeitkomplexitรคt von O(1). Die Zeitkomplexitรคt im schlimmsten Fall betrรคgt O(n). Der schlimmste Fall tritt ein, wenn viele Werte denselben Hash-Schlรผssel generieren und wir die Kollision durch Sondieren auflรถsen mรผssen.

Reale Anwendungen

In der Praxis werden Hash-Tabellen zum Speichern von Daten verwendet

  • Datenbanken
  • Assoziative Arrays
  • Sets
  • Speicher-Cache

Vorteile von Hash-Tabellen

Hier sind die Vorteile/Vorteile der Verwendung von Hash-Tabellen:

  • Hash-Tabellen bieten eine hohe Leistung beim Nachschlagen von Daten sowie beim Einfรผgen und Lรถschen vorhandener Werte.
  • Die zeitliche Komplexitรคt fรผr Hash-Tabellen ist unabhรคngig von der Anzahl der Elemente in der Tabelle konstant.
  • Sie funktionieren auch bei der Arbeit mit groรŸen Datenmengen sehr gut.

Nachteile von Hash-Tabellen

Hier sind die Nachteile der Verwendung von Hash-Tabellen:

  • Sie kรถnnen keinen Nullwert als Schlรผssel verwenden.
  • Bei der Schlรผsselgenerierung mit kรถnnen Kollisionen nicht vermieden werden. Hash-Funktionen. Kollisionen treten auf, wenn ein Schlรผssel generiert wird, der bereits verwendet wird.
  • Wenn die Hashing-Funktion viele Kollisionen aufweist, kann dies zu LeistungseinbuรŸen fรผhren.

Zusammenfassung

  • Hash-Tabellen werden zum Speichern von Daten mithilfe eines Schlรผssel-Wert-Paares verwendet.
  • Eine Hash-Funktion verwendet einen mathematischen Algorithmus zur Berechnung des Hash-Werts.
  • Eine Kollision tritt auf, wenn fรผr mehr als einen Wert derselbe Hashwert generiert wird.
  • Durch die Verkettung werden Kollisionen gelรถst, indem verknรผpfte Listen erstellt werden.
  • Beim Sondieren werden Kollisionen gelรถst, indem leere Slots in der Hash-Tabelle gefunden werden.
  • Die lineare Abtastung sucht nach dem nรคchsten freien Steckplatz, um den Wert ab dem Steckplatz zu speichern, in dem die Kollision aufgetreten ist.
  • Bei der quadratischen Sondierung werden Polynomausdrรผcke verwendet, um bei einer Kollision den nรคchsten freien Slot zu finden.
  • Double Beim Hashing wird ein sekundรคrer Hash-Funktionsalgorithmus verwendet, um bei einer Kollision den nรคchsten freien Slot zu finden.
  • Hash-Tabellen weisen im Vergleich zu anderen Datenstrukturen eine bessere Leistung auf.
  • Die durchschnittliche Zeitkomplexitรคt von Hash-Tabellen betrรคgt O (1)
  • Ein Wรถrterbuchdatentyp in Python ist ein Beispiel fรผr eine Hash-Tabelle.
  • Hash-Tabellen unterstรผtzen Einfรผge-, Such- und Lรถschvorgรคnge.
  • Ein Nullwert kann nicht als Indexwert verwendet werden.
  • Kollisionen kรถnnen in Hash-Funktionen nicht vermieden werden. Eine gute Hash-Funktion minimiert die Anzahl der auftretenden Kollisionen, um die Leistung zu verbessern.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: