Hashmap -Zeitkomplexität und C ++

Hashmap -Zeitkomplexität und C ++
„Zeitkomplexität ist die relative Laufzeit einiger Codierung. Bevor der Leser die zeitliche Komplexität eines HashMap erörtert, muss er die Rolle einer Hash -Funktion in einer Hash -Karte kennenlernen.

Theoretisch würde eine Hash -Funktion Daten jeder Größe (jedem großen Text) in eine ganze Zahl umwandeln, die größer oder gleich Null ist. Verschiedene große Texte werden in verschiedene Zahlen umgewandelt. Das Interesse an diesem Artikel besteht nicht darin, großen Text in eine Ganzzahl umzuwandeln. Das Interesse an diesem Artikel besteht darin, Daten einer beliebigen Größe auf eine ganze Zahl zuzuordnen. Dies schließt die Möglichkeit der Zuordnung (Konvertierung) einer einzelnen Zahl in eine andere einzelne Zahl ein.

Daten (links) zu kartieren werden als Schlüssel bezeichnet. So wird jeder Schlüssel in eine ganze Zahl konvertiert, die gleich oder größer als Null ist. Stellen Sie sich vor, es gibt fünf Schlüssel, die in Zahlen umgewandelt wurden: 0, 1, 2, 3 und 4. Wenn diese Schlüssel die Indizes eines Arrays sind, das fünf Werte desselben Typs enthält, wurden diese Schlüssel auf fünf verschiedene Werte abgebildet.

Und so ist ein HashMap (Hash -Karte)? Eine HashMap ist eine Datenstruktur, die aus Schlüssel-/Wertpaaren besteht, wobei jeder Schlüssel einem Wert zugeordnet wurde. Tatsächlich wurde jeder Schlüssel in eine Reihe eines Arrays gehasht, und die entsprechende Array -Zelle besteht darin, einen Wert zu halten. Im HashMap -Thema wird der Ort für die Zelle jedes Array -Index als Eimer bezeichnet.”

Kollisionsproblem und Lösung

In der Praxis können unterschiedliche Schlüssel auf mehr als einen Wert abgebildet werden. Betrachten Sie den Fall von zehn Schlüssel für eine Reihe von Länge 5 mit 5 Eimer. In diesem Fall würde eine Struktur wie ein Array-of-Arrays konstruiert. Jeder Eimer wäre tatsächlich eine Reihe von Länge 2. Zwei Schlüssel würden den gleichen Eimer teilen. In dieser Freigabe würde die erste Taste dem ersten Array -Element für den Eimer zugeordnet, und die zweite Taste würde dem zweiten Array -Element für denselben Eimer zuordnen. Dieses Schema löst das Kollisionsproblem auf, und zehn Schlüssel wurden erwartungsgemäß auf 10 Werte zugeordnet.

Stellen Sie sich für den Rest dieses Artikels eine Hashmap mit dem Kollisionsproblem vor. Ziel dieses Artikels ist es, die zeitliche Komplexität der Codierung für das Einfügen in einen HashMap, die Codierung für das Löschen in eine HashMap und die Codierung für die Suche in einem HashMap bereitzustellen. Die zeitliche Komplexität von HashMap wird mit diesen drei Merkmalen beschrieben. Hash-Mapping für C ++ wird auch in diesem Artikel behandelt.

Schlüssel-/Wertpaare und value_type

Stellen Sie sich eine Hashmap mit Namen von Personen gegen Telefonnummern für ein Telefonverzeichnis vor. Die Namen von Telefonnutzern sind von Datentyp, Text (String) vom Datentyp, Text (String). Die Werte von Telefonnummern sind Datentyp und Text, vorausgesetzt, Räume und/oder Bindestriche sind in einer Telefonnummer zulässig. Die Benutzernamen sind die Schlüssel und die Telefonnummern sind die Werte. Vergessen Sie nicht, dass die Schlüssel intern in der Datenstruktur tatsächlich in Array -Indizes konvertiert werden. Der Schlüsseltyp ist also Text und der Werttyp ist noch Text.

Werttyp bedeutet das Schlüssel-/Wertpaar als Element. In C ++ wird jedes Element (Paar) von einem Iterator vermittelt. In C ++ gibt es also auch Iterator/Paar Mapping. Ein Paar (Schlüssel und sein Wert) wird als Werttyp bezeichnet.

Zeitkomplexität für das Einfügen von Hashmap

Die zeitliche Komplexität für einen HashMap bezieht sich nicht auf die Zeit, die zum Erstellen des Hashmap benötigt wird. Es bezieht sich auf die Zeit, die zum Einfügen, Löschen oder Suchen nach einem Wert auf einem bestimmten Schlüssel benötigt wird. Die Zeitkomplexität wird normalerweise mit der Big-O-Notation geschrieben. Die Big-O-Notation besteht aus O in Großbuchstaben, gefolgt von Klammern. In den Klammern sind Variablen und Zahlen, die die relative Laufzeit für ein Stück Code und nicht unbedingt das gesamte Programm geben. Mit dem HashMap bedeutet K die Anzahl der Schlüssel und n die Anzahl der Eimer. Denken Sie daran, dass ein Eimer mit einigen Hashmaps mehr als einen Wert für entsprechend unterschiedliche Schlüssel hat. In diesem Fall wird mehr als ein Schlüssel in denselben Bucket -Index gehasht. Eine gute Hashmap löst diese Kollision auf.

Einfügen

Bei einem neuen Schlüssel ist die Komplexität der Durchschnittsfallzeit für den Schlüssel und seinen entsprechenden Wert in eine HashMap-Datenstruktur eingefügt:

O (1 + n/k)

Wobei n die Anzahl der Eimer ist und k die Anzahl der Schlüssel ist. Zum Beispiel n vielleicht 10 und k vielleicht 5. In dieser speziellen Situation sind einige Eimer leer (haben keinen Wert). Die Anzahl der Operationen wäre also 1 + 10/5 = 1 + 2 = 3. Das heißt, es würde 3 Codierungsvorgänge geben, um ein Schlüssel-/Wertpaarelement einzufügen (bei der Schlüssel). Bei einem neuen Schlüssel und Wert ist die schlimmste Zeitkomplexität, die den Schlüssel und seinen entsprechenden Wert in eine HashMap-Datenstruktur eingefügt wird,:

An)

Wenn n die Anzahl der Eimer für N -Operationen ist, wenn der HashMap mehr als einen Taste mehr als einen Wert pro Bucket benötigt, ist jeder zusätzliche Zeitpunkt, um einen weiteren Wert in denselben Eimer einzufügen, vernachlässigbar und vernachlässigt.

Streichung

Bei einem Schlüssel, das bereits in der HashMap -Datenstruktur strukturiert ist, löscht das Löschen das Schlüssel-/Wertpaarelement. Die durchschnittliche Komplexität der Deletion ist:

O (1 + n/k)

Wobei n die Anzahl der Eimer ist und k die Anzahl der Schlüssel ist. Zum Beispiel n vielleicht 10 und k vielleicht 5. In dieser speziellen Situation sind einige Eimer leer (haben keinen Wert). Die Anzahl der Operationen für den Löschcode wäre also 1 + 10/5 = 1 + 2 = 3. Hier würden 3 Codierungsvorgänge zum Löschen eines Schlüssel-/Wertpaarelements bei der Taste geben.

Die schlimmste Zeitkomplexität für die Löschung mit einem Schlüssel ist:

An)

Wenn n die Anzahl der Eimer ist. Wenn also N -Eimer für die HashMap -Datenstruktur vorhanden sind, würde es 10 Vorgänge benötigen, um ein Schlüssel-/Wertpaarelement im HashMap zu löschen.

Suche

Suchen bedeutet, das Element des Schlüssel-/Wertpaares zu finden, das den angegebenen Schlüssel enthält, der bereits in der HashMap enthalten sein sollte. Die Komplexität der Durchschnittsfallzeit dafür ist:

O (1 + n/k)

Mit den Argumenten mit den gleichen Bedeutungen wie oben. Die schlimmste Zeitkomplexität dafür ist:

An)

Mit dem Argument, der die gleiche Bedeutung hat wie oben.

C ++ 20

Hat C ++ 20 eine Hashmap -Klasse?? - Ja, aber nicht mit dem Namen Hashmap. C ++ 20 hat vier ungeordnete assoziative Container, bei denen es sich um verschiedene Formen von Hashmap -Klassen handelt. Die Container sind: unbestraftet_map, nicht ordnungsgemäß_multimap, unbestraftet_set und nicht ordnungsgemäß_multiset. Diese assoziativen Container befinden sich in der Standardbibliothek C ++ 20. Der in diesem Artikel zu berücksichtigende assoziative Container ist nicht ordnungsgemäß_map. Die nicht ordnungsgemäße_Map verwendet eine Standard -Hash -Funktion, die von der C ++ - Standardbibliothek bereitgestellt wird.

Verwenden Sie die Anweisung,

#enthalten

Verwenden Sie #include nicht, das den ordnungsgedichten_map enthält. C ++ nimmt #include nicht . Der Header für nicht ordnungsgemäße.

Einfügen mit c++

Das folgende Codesegment in der Hauptfunktion C ++ fügt ein Element des Schlüssel-/Wertpaares (Name und Telefonnummer) in das Objekt Under Ordered_Map, Ump:, ein

#enthalten
Under Ordered_map Ump;
Ump.Insert ("John Rambo", "555-5555");

Löschen mit c++

Die Syntax zum Löschen eines Schlüssel-/Wertpaarelements aus einem nicht ordnungsgemäßen Objekt, bei dem der Schlüssel K, lautet:

A.löschen (k)

Wobei „A“ das nicht ordnungsgemäße Objekt (wie um UMP oben) und erase () die Funktion für nicht ordnungsgemäße_Map ist.

Suche

Die Syntax zum Durchsuchen eines Schlüssel-/Wertpaarelements in einem nicht ordnungsgemäßen Objekt, bei dem der Schlüssel k, das bereits in der nicht ordnungsgemäßen Stelle der entworfenen Folgendes liegt, betrifft, lautet:

B.Finden Sie (k)

Wobei B das nicht ordnungsgemäße.

Abschluss

Zeitkomplexität bedeutet die relative Laufzeit für einen Code. Obwohl die zeitliche Komplexität für die Erstellung eines HashMap ermittelt werden kann, ist die Zeitkomplexität beim Einfügen, Löschen und Suchen von Aufgaben bestimmt, wenn es um die HashMap geht. Die durchschnittliche und schlechtere Fallzeitkomplexitäten für einen gut definierten Hashmap-Einsatz sind:

O (1 + n/k)
An)

Die durchschnittliche und schlechtere Fallzeitkomplexitäten für eine gut definierte Hashmap-Löschung sind:

O (1 + n/k)
An)

Die durchschnittliche und schlechtere Fallzeitkomplexitäten für eine gut definierte Hashmap-Suche sind:

O (1 + n/k)
An)