Hash-Tabelle in Datenstruktur: Python Beispiel

โšก Intelligente Zusammenfassung

Hashtabellen in Datenstrukturen speichern Werte als Schlรผssel-Wert-Paare. Dabei wird eine Hashfunktion verwendet, um jedem Schlรผssel einen Index fรผr schnelles Auffinden zuzuordnen. Diese Ressource erklรคrt Hashfunktionen, Kollisionen, Verkettung, Sondierung, Operationen und mehr. Python Beispiele einschlieรŸlich des integrierten Wรถrterbuchs.

  • ๐Ÿ”‘ Kernidee: Eine Hashtabelle speichert Schlรผssel-Wert-Paare, wobei eine Hashfunktion jeden Schlรผssel in einen Array-Index umwandelt.
  • ๐Ÿงฎ Hash-Funktion: Eine gรคngige Formel verwendet den Modulo-Operator h(k) = k % m, um die Schlรผssel innerhalb der TabellengrรถรŸe zu halten.
  • ๐Ÿ’ฅ Kollisionen: Wenn zwei Schlรผssel auf denselben Index verweisen, kann der Konflikt durch Verkettung oder Sondierung aufgelรถst werden.
  • โšก Eigenschaften: Die Suche, das Einfรผgen und Lรถschen in Hashtabellen erfolgt im Durchschnitt in O(1)-Zeit, unabhรคngig von der GrรถรŸe des Datensatzes.
  • ๐Ÿ Python Ejemplo: Der integrierte Wรถrterbuchtyp ist eine Hashtabelle, die Hashing und Kollisionen automatisch verwaltet.

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 Hashfunktion lรถst das obige Problem, indem sie die Mitarbeiternummer ermittelt und daraus einen Hashwert mit fester Ziffernanzahl generiert, um den Speicherplatz zu optimieren. Die Hashfunktion erzeugt einen Schlรผssel, der als Referenz fรผr den zu speichernden Wert dient. Sie nimmt den zu speichernden Wert entgegen und berechnet anschlieรŸend 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 2% 7 2
9 9% 7 2
11 11% 7 4
7 7% 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)}')

Hash-tabelle Code Erlรคuterung

Hash-tabelle Code Erlรคuterung

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.

Hรคufig gestellte Fragen

Ein Array verwendet fortlaufende ganzzahlige Indizes, daher erfordert das Suchen eines Elements anhand seines Wertes das Scannen des Arrays. Eine Hashtabelle ordnet jedem Schlรผssel รผber eine Hashfunktion einen Index zu und ermรถglicht so unabhรคngig von der GrรถรŸe eine durchschnittliche Zugriffszeit von O(1) fรผr Suchen, Einfรผgen und Lรถschen.

Der Auslastungsfaktor ist das Verhรคltnis der gespeicherten Eintrรคge zur Gesamtzahl der Speicherplรคtze in einer Hashtabelle. Ein hoher Auslastungsfaktor erhรถht die Kollisionswahrscheinlichkeit und verlangsamt die Operationen. Daher passen viele Implementierungen die GrรถรŸe der Hashtabelle an und fรผhren einen erneuten Hash-Vorgang durch, sobald der Auslastungsfaktor einen bestimmten Schwellenwert รผberschreitet.

Beim Chaining werden kollidierende Schlรผssel in verketteten Listen an jedem freien Platz gespeichert, sodass die Tabelle mehr Elemente als Plรคtze aufnehmen kann. Beim Open Addressing (Probing) bleiben alle Eintrรคge im Array erhalten, wรคhrend nach dem nรคchsten freien Platz gesucht wird. Chaining ist besser fรผr hohe Lasten geeignet.

Hashing unterstรผtzt KI durch Feature-Hashing, auch Hashing-Trick genannt. Dabei werden groรŸe Text- oder Kategorienmerkmale auf einen Vektor fester GrรถรŸe abgebildet. Dies spart Speicherplatz und beschleunigt das Training, allerdings kรถnnen Hash-Kollisionen unterschiedliche Merkmale verschmelzen.

Ja. KI kann Hash-Funktionsdesigns vorschlagen, sie auf gleichmรครŸige Verteilung testen und Kollisionsraten anhand von Beispieldaten schรคtzen. Sie hilft beim Vergleich von Optionen, aber Sie sollten die Funktion dennoch vor der endgรผltigen Implementierung anhand Ihrer realen Arbeitslast testen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: