Inhaltsverzeichnis
总结
补充一个小知识点
Heim Web-Frontend js-Tutorial Detaillierte Einführung in Hash-Tabellen (Hash-Tabellen) in JavaScript (Codebeispiele)

Detaillierte Einführung in Hash-Tabellen (Hash-Tabellen) in JavaScript (Codebeispiele)

Jan 02, 2019 am 09:37 AM
javascript node.js 数据结构

Dieser Artikel bietet Ihnen eine detaillierte Einführung (Codebeispiel) in JavaScript. Ich hoffe, dass er Ihnen als Referenz dienen wird.

Hash-Tabelle

Hash-Tabelle (auch Hash-Tabelle genannt) greift basierend auf der Schlüsseldatenstruktur (Schlüssel) direkt auf den Speicherort zu. Das heißt, es greift auf den Datensatz zu, indem eine Funktion für den Schlüsselwert berechnet wird, die die erforderlichen Abfragedaten einer Position in der Tabelle zuordnet, was die Suche beschleunigt. Diese Zuordnungsfunktion wird als Hash-Funktion bezeichnet, und das Array, in dem die Datensätze gespeichert sind, wird als Hash-Tabelle bezeichnet.

Detaillierte Einführung in Hash-Tabellen (Hash-Tabellen) in JavaScript (Codebeispiele)

Wir beginnen mit der Analyse des obigen Bildes

  • Es gibt eine Menge U, die 1000, 10, 152, 9733, 1555, 997, 1168

  • Die rechte Seite ist eine Liste (Hash-Tabelle) mit 10 Slots. Wir müssen die ganzen Zahlen in der Menge U in dieser Liste speichern

  • Wie wird es aufbewahrt und in welchem ​​Steckplatz? Dieses Problem muss durch eine Hash-Funktion gelöst werden. Meine Speichermethode besteht darin, den Rest von 10 zu nehmen. Schauen wir uns dieses Bild an

    • 1000%10=0, 10%10=0, dann die beiden ganzen Zahlen 1000 und 10 Es wird im Steckplatz mit der Nummer 0

    • 152 %10=2 gespeichert, dann wird es im Steckplatz 2

    • 9733 %10 gespeichert =3 wird im Steckplatz mit der Nummer 3 gespeichert

Durch das obige einfache Beispiel sollten Sie ein allgemeines Verständnis der folgenden Punkte haben

  • Die Menge U ist der Schlüssel, der in der Hash-Tabelle erscheinen kann

  • Die Hash-Funktion ist eine Methode Ihres eigenen Designs, um die Menge der Schlüsselwerte zu kombinieren ​in U werden durch eine Berechnung in der Hash-Tabelle gespeichert, wie zum Beispiel der Rest

  • im Beispiel, der den berechneten Schlüssel

speichert Dann wollen wir mal sehen, wie wir normalerweise den Wert ermitteln?

Zum Beispiel speichern wir einen Schlüssel als 1000 und einen Wert als „Zhang San“ ---> Sollte es in diesem Steckplatz von 1000 % 10 gespeichert werden?
Wenn wir den Wert Zhang San über den Schlüssel finden möchten, können wir dann einfach im Schlüssel-%10-Slot suchen? An diesem Punkt können Sie innehalten und nachdenken.

Einige Begriffe für Hashing (Sie können einen kurzen Blick darauf werfen)

  • Alle möglichen Schlüssel in der Hash-Tabelle werden als vollständiger Satz U bezeichnet

  • Verwenden Sie M, um die Anzahl der Slots darzustellen

  • Anhand eines Schlüssels berechnet die Hash-Funktion, in welchem ​​Slot er erscheinen soll. Die Hash-Funktion h=k% oben Beispiel M, die Hash-Funktion h ist eine Zuordnung von Schlüssel k zu Slot.

  • Sowohl 1000 als auch 10 werden im Steckplatz mit der Nummer 0 gespeichert. Diese Situation wird als Kollision bezeichnet.

Nachdem ich das gelesen habe, weiß ich nicht, ob Sie ein allgemeines Verständnis davon haben, was eine Hash-Funktion ist. Durch das Beispiel und Ihre Überlegungen können Sie zurückgehen und die Definition der Hash-Tabelle oben im Artikel lesen. Wenn Sie es lesen können, sollten Sie es wohl auch verstehen.

Häufig verwendete Hash-Funktionen

Ganzzahlen verarbeiten h=>k%M (das heißt das Beispiel, das wir oben angegeben haben)

Zeichenfolgen verarbeiten:

    function h_str(str,M){
        return [...str].reduce((hash,c)=>{
            hash = (31*hash + c.charCodeAt(0)) % M
        },0)
    }
Nach dem Login kopieren
Der Hash-Algorithmus steht hier nicht im Mittelpunkt, und ich habe ihn nicht eingehend untersucht. Hier geht es vor allem darum, zu verstehen, was für eine Datenstruktur eine Hash-Tabelle ist, welche Vorteile sie hat und was sie konkret bewirkt.

Die Hash-Funktion ordnet Schlüssel nur über einen bestimmten Algorithmus Listen zu.

Erstellen einer Hash-Tabelle

Durch die obige Erklärung erstellen wir hier eine einfache Hash-Tabelle

Die Zusammensetzung der Hash-Tabelle

  • M-Slots

  • haben eine Hash-Funktion

  • und eine Add-Methode, um den Schlüsselwert zur Hash-Tabelle hinzuzufügen

  • Es gibt eine Löschmethode zum Löschen

  • Es gibt eine Suchmethode, um den entsprechenden Wert basierend auf dem Schlüssel zu finden

Initialisierung

-Initialisieren Sie, wie viele Slots die Hash-Tabelle hat

-Verwenden Sie ein Array, um M Slots zu erstellen

    class HashTable {
        constructor(num=1000){
            this.M = num;
            this.slots = new Array(num);
        }
    }
Nach dem Login kopieren
Hash-Funktion

Hash-Funktion, die verarbeitet Zeichenfolgen werden hier verwendet, da Werte auch in Zeichenfolgen umgewandelt werden können.

Konvertieren Sie zunächst den übergebenen Schlüsselwert in eine Zeichenfolge,

Konvertieren Sie die Zeichenfolge in ein Array, zum Beispiel 'abc' => Der Zweck, den Rest von M zu nehmen, besteht darin, genau der Anzahl der Slots insgesamt zu entsprechen. Ihr Wert %10 wird definitiv in die Slots von 0-9 fallen

rrree

Hinzufügen

Hash aufrufen Die Funktion erhält die entsprechende Speicheradresse (das ist der Slot unserer Analogie)

Da in einem Slot möglicherweise mehrere Werte gespeichert sind, muss dies der Fall sein dargestellt durch ein zweidimensionales Array, z. B. den von uns berechneten Slot. Die Zahl ist 0, also Slot[0], dann sollten wir sie in Slot[0][0] speichern Steckplatz mit der Nummer 0, dann sollten wir ihn in Steckplatz[0][1] speichern

    h(str){
        str = str + '';
        return [...str].reduce((hash,c)=>{
            hash = (331 * hash + c.charCodeAt()) % this.M;
            return hash;
        },0)
    }
Nach dem Login kopieren
Löschen

Steckplatz durch Hash-Algorithmus finden

Löschen durch Filtern

    add(key,value) {
        const h = this.h(key);
        // 判断这个槽是否是一个二维数组, 不是则创建二维数组
        if(!this.slots[h]){
            this.slots[h] = [];
        }
        // 将值添加到对应的槽中
        this.slots[h].push(value);
    }
Nach dem Login kopieren
Suchen

Suchen Sie den entsprechenden Slot mithilfe des Hash-Algorithmus Slot

Verwenden Sie die Suchfunktion, um den Wert desselben Schlüssels zu finden

Geben Sie den entsprechenden Wert zurück

    search(key){
        const h = this.h(key);
        const list = this.slots[h];
        const data = list.find(x=> x.key === key);
        return data ? data.value : null;    
    }
Nach dem Login kopieren

总结

讲到这里,散列表的数据结构已经讲完了,其实我们每学一种数据结构或算法的时候,不是去照搬实现的代码,我们要学到的是思想,比如说散列表它究竟做了什么,它是一种存储方式,可以快速的通过键去查找到对应的值。那么我们会思考,如果我们设计的槽少了,在同一个槽里存放了大量的数据,那么这个散列表它的搜索速度肯定是会大打折扣的,这种情况又应该用什么方式去解决,又或者是否用其他的数据结构的代替它。

补充一个小知识点

v8引擎中的数组 arr = [1,2,3,4,5] 或 new Array(100) 我们都知道它是开辟了一块连续的空间去存储,而arr = [] , arr[100000] = 10 这样的操作它是使用的散列,因为这种操作如果连续开辟100万个空间去存储一个值,那么显然是在浪费空间。


Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Hash-Tabellen (Hash-Tabellen) in JavaScript (Codebeispiele). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Vergleichen Sie komplexe Datenstrukturen mithilfe des Java-Funktionsvergleichs Vergleichen Sie komplexe Datenstrukturen mithilfe des Java-Funktionsvergleichs Apr 19, 2024 pm 10:24 PM

Bei der Verwendung komplexer Datenstrukturen in Java wird Comparator verwendet, um einen flexiblen Vergleichsmechanismus bereitzustellen. Zu den spezifischen Schritten gehören: Definieren einer Komparatorklasse und Umschreiben der Vergleichsmethode, um die Vergleichslogik zu definieren. Erstellen Sie eine Komparatorinstanz. Verwenden Sie die Methode „Collections.sort“ und übergeben Sie die Sammlungs- und Komparatorinstanzen.

Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung May 08, 2024 pm 10:12 PM

Datenstrukturen und Algorithmen sind die Grundlage der Java-Entwicklung. In diesem Artikel werden die wichtigsten Datenstrukturen (wie Arrays, verknüpfte Listen, Bäume usw.) und Algorithmen (wie Sortier-, Such-, Diagrammalgorithmen usw.) ausführlich untersucht. Diese Strukturen werden anhand praktischer Beispiele veranschaulicht, darunter die Verwendung von Arrays zum Speichern von Bewertungen, verknüpfte Listen zum Verwalten von Einkaufslisten, Stapel zum Implementieren von Rekursionen, Warteschlangen zum Synchronisieren von Threads sowie Bäume und Hash-Tabellen für schnelle Suche und Authentifizierung. Wenn Sie diese Konzepte verstehen, können Sie effizienten und wartbaren Java-Code schreiben.

Vertieftes Verständnis der Referenztypen in der Go-Sprache Vertieftes Verständnis der Referenztypen in der Go-Sprache Feb 21, 2024 pm 11:36 PM

Referenztypen sind ein spezieller Datentyp in der Go-Sprache. Ihre Werte speichern nicht direkt die Daten selbst, sondern die Adresse der gespeicherten Daten. In der Go-Sprache umfassen Referenztypen Slices, Karten, Kanäle und Zeiger. Ein tiefes Verständnis der Referenztypen ist entscheidend für das Verständnis der Speicherverwaltungs- und Datenübertragungsmethoden der Go-Sprache. In diesem Artikel werden spezifische Codebeispiele kombiniert, um die Merkmale und Verwendung von Referenztypen in der Go-Sprache vorzustellen. 1. Slices Slices sind einer der am häufigsten verwendeten Referenztypen in der Go-Sprache.

PHP-Datenstruktur: Das Gleichgewicht der AVL-Bäume sorgt für eine effiziente und geordnete Datenstruktur PHP-Datenstruktur: Das Gleichgewicht der AVL-Bäume sorgt für eine effiziente und geordnete Datenstruktur Jun 03, 2024 am 09:58 AM

Der AVL-Baum ist ein ausgewogener binärer Suchbaum, der schnelle und effiziente Datenoperationen gewährleistet. Um ein Gleichgewicht zu erreichen, führt es Links- und Rechtsdrehungen durch und passt Teilbäume an, die das Gleichgewicht verletzen. AVL-Bäume nutzen den Höhenausgleich, um sicherzustellen, dass die Höhe des Baums im Verhältnis zur Anzahl der Knoten immer klein ist, wodurch Suchoperationen mit logarithmischer Zeitkomplexität (O(logn)) erreicht werden und die Effizienz der Datenstruktur auch bei großen Datensätzen erhalten bleibt.

Vollständige Analyse des Java-Sammlungsframeworks: Analyse der Datenstruktur und Enthüllung des Geheimnisses effizienter Speicherung Vollständige Analyse des Java-Sammlungsframeworks: Analyse der Datenstruktur und Enthüllung des Geheimnisses effizienter Speicherung Feb 23, 2024 am 10:49 AM

Überblick über das Java Collection Framework Das Java Collection Framework ist ein wichtiger Teil der Programmiersprache Java. Es stellt eine Reihe von Containerklassenbibliotheken bereit, die Daten speichern und verwalten können. Diese Containerklassenbibliotheken verfügen über unterschiedliche Datenstrukturen, um den Datenspeicher- und -verarbeitungsanforderungen in verschiedenen Szenarien gerecht zu werden. Der Vorteil des Sammlungsframeworks besteht darin, dass es eine einheitliche Schnittstelle bietet, die es Entwicklern ermöglicht, verschiedene Containerklassenbibliotheken auf die gleiche Weise zu betreiben, wodurch die Entwicklungsschwierigkeiten verringert werden. Datenstrukturen des Java-Sammlungsframeworks Das Java-Sammlungsframework enthält eine Vielzahl von Datenstrukturen, von denen jede ihre eigenen einzigartigen Eigenschaften und anwendbaren Szenarien aufweist. Im Folgenden sind einige gängige Datenstrukturen des Java Collection Frameworks aufgeführt: 1. Liste: Liste ist eine geordnete Sammlung, die die Wiederholung von Elementen ermöglicht. Li

Die KI-Ära von JS ist da! Die KI-Ära von JS ist da! Apr 08, 2024 am 09:10 AM

Einführung in JS-Torch JS-Torch ist eine Deep-Learning-JavaScript-Bibliothek, deren Syntax PyTorch sehr ähnlich ist. Es enthält ein voll funktionsfähiges Tensorobjekt (kann mit verfolgten Farbverläufen verwendet werden), Deep-Learning-Ebenen und -Funktionen sowie eine automatische Differenzierungs-Engine. JS-Torch eignet sich für die Deep-Learning-Forschung in JavaScript und bietet viele praktische Tools und Funktionen zur Beschleunigung der Deep-Learning-Entwicklung. Image PyTorch ist ein Open-Source-Deep-Learning-Framework, das vom Meta-Forschungsteam entwickelt und gepflegt wird. Es bietet einen umfangreichen Satz an Tools und Bibliotheken zum Erstellen und Trainieren neuronaler Netzwerkmodelle. PyTorch ist einfach, flexibel und benutzerfreundlich konzipiert und verfügt über dynamische Berechnungsdiagrammfunktionen

Vergleich von Golang und Node.js in der Back-End-Entwicklung Vergleich von Golang und Node.js in der Back-End-Entwicklung Jun 03, 2024 pm 02:31 PM

Go und Node.js weisen Unterschiede in der Typisierung (stark/schwach), der Parallelität (Goroutine/Ereignisschleife) und der Speicherbereinigung (automatisch/manuell) auf. Go hat einen hohen Durchsatz und eine geringe Latenz und eignet sich für Backends mit hoher Auslastung; Node.js eignet sich gut für asynchrone E/A und eignet sich für hohe Parallelität und kurze Anfragen. Praktische Beispiele für beide sind Kubernetes (Go), Datenbankverbindungen (Node.js) und Webanwendungen (Go/Node.js). Die endgültige Wahl hängt von den Anwendungsanforderungen, den Teamfähigkeiten und den persönlichen Vorlieben ab.

Die auf Hash-Tabellen basierende Datenstruktur optimiert die Schnitt- und Vereinigungsberechnungen von PHP-Arrays Die auf Hash-Tabellen basierende Datenstruktur optimiert die Schnitt- und Vereinigungsberechnungen von PHP-Arrays May 02, 2024 pm 12:06 PM

Die Hash-Tabelle kann zur Optimierung von PHP-Array-Schnittpunkt- und Vereinigungsberechnungen verwendet werden, wodurch die Zeitkomplexität von O(n*m) auf O(n+m) reduziert wird. Die spezifischen Schritte sind wie folgt: Verwenden Sie eine Hash-Tabelle, um die Elemente von zuzuordnen Wandeln Sie das erste Array in einen booleschen Wert um, um schnell herauszufinden, ob das Element im zweiten Array vorhanden ist, und um die Effizienz der Schnittpunktberechnung zu verbessern. Verwenden Sie eine Hash-Tabelle, um die Elemente des ersten Arrays als vorhanden zu markieren, und fügen Sie dann die Elemente des zweiten Arrays nacheinander hinzu, wobei Sie vorhandene Elemente ignorieren, um die Effizienz der Vereinigungsberechnungen zu verbessern.

See all articles