Table des matières
总结
补充一个小知识点
Maison interface Web js tutoriel Introduction détaillée aux tables de hachage (tables de hachage) en JavaScript (exemples de code)

Introduction détaillée aux tables de hachage (tables de hachage) en JavaScript (exemples de code)

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

Le contenu de cet article est une introduction détaillée (exemple de code) sur les tables de hachage (tables de hachage) en JavaScript. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. .

Table de hachage

La table de hachage (également appelée table de hachage) accède directement à l'emplacement de stockage mémoire en fonction de la structure de données clé (Clé). Autrement dit, il accède à l'enregistrement en calculant une fonction sur la valeur clé qui mappe les données de requête requises à un emplacement dans la table, ce qui accélère la recherche. Cette fonction de mappage est appelée fonction de hachage et le tableau stockant les enregistrements est appelé table de hachage.

Introduction détaillée aux tables de hachage (tables de hachage) en JavaScript (exemples de code)

On part de l'image ci-dessus pour analyser

  • Il existe un ensemble U, qui est 1000, 10, 152, 9733, 1555, 997, 1168

  • Le côté droit est une liste (table de hachage) de 10 emplacements Nous devons stocker les entiers de l'ensemble U dans cette liste

  • Comment le stocker et dans quel emplacement ? Ce problème doit être résolu via une fonction de hachage. Ma méthode de stockage est de prendre le reste de 10. Regardons cette image

    • 1000%10=0, 10%10=0, puis les deux entiers 1000 et 10 Il sera stocké dans l'emplacement numéroté 0

    • 152%10=2 puis il sera stocké dans l'emplacement 2

    • 9733 %10 =3 est stocké dans l'emplacement numéroté 3

Grâce à l'exemple simple ci-dessus, vous devriez avoir une compréhension générale des points suivants

  • L'ensemble U est la clé qui peut apparaître dans la table de hachage

  • La fonction de hachage est une méthode de votre propre conception pour combiner l'ensemble Les valeurs clés ​​dans U sont stockés dans la table de hachage grâce à un calcul, comme le reste

  • dans l'exemple, qui stocke la clé calculée

Alors voyons comment nous obtenons habituellement la valeur ?

Par exemple, nous stockons une clé sous la forme 1000 et une valeur sous la forme « Zhang San » ---> {key:1000, value:'Zhang San'>

D'après notre explication ci-dessus, Doit-il être stocké dans cet emplacement de 1000%10 ?
Lorsque nous voulons trouver la valeur Zhang San via la clé, pouvons-nous simplement rechercher dans l'emplacement key%10 ? À ce stade, vous pouvez vous arrêter et réfléchir.

Quelques terminologies de hachage (vous pouvez y jeter un bref coup d'œil)

  • Toutes les clés pouvant apparaître dans la table de hachage sont appelées l'ensemble complet U

  • Utilisez M pour représenter le nombre d'emplacements

  • Étant donné une clé, la fonction de hachage calcule dans quel emplacement elle doit apparaître. La fonction de hachage h= k% dans l'exemple M ci-dessus, la fonction de hachage h est un mappage de la clé k à l'emplacement.

  • 1000 et 10 sont tous deux stockés dans l'emplacement numéroté 0. Cette situation s'appelle une collision.

Après avoir lu ceci, je ne sais pas si vous avez une compréhension générale de ce qu'est une fonction de hachage. Grâce à l'exemple et à votre réflexion, vous pouvez revenir en arrière et lire la définition de la table de hachage en haut de l'article. Si vous pouvez le lire, alors je suppose que vous devriez le comprendre.

Fonctions de hachage couramment utilisées

Traiter les entiers h=>k%M (qui est l'exemple que nous avons donné ci-dessus)

Traiter les chaînes :

    function h_str(str,M){
        return [...str].reduce((hash,c)=>{
            hash = (31*hash + c.charCodeAt(0)) % M
        },0)
    }
Copier après la connexion
L'algorithme de hachage n'est pas au centre des préoccupations ici, et je ne l'ai pas étudié en profondeur. L'essentiel ici est de comprendre quel type de structure de données est une table de hachage, quels sont ses avantages et ce qu'elle fait spécifiquement.

La fonction de hachage mappe simplement les clés aux listes via un certain algorithme.

Construire une table de hachage

Grâce à l'explication ci-dessus, nous allons créer ici une table de hachage simple

La composition de la table de hachage

  • Les emplacements M

  • ont une fonction de hachage

  • et ont une méthode d'ajout pour ajouter la valeur clé à la table de hachage

  • Il existe une méthode de suppression pour supprimer

  • Il existe une méthode de recherche pour trouver la valeur correspondante en fonction de la clé

Initialisation

-Initialiser le nombre d'emplacements de la table de hachage

-Utiliser un tableau pour créer M emplacements

    class HashTable {
        constructor(num=1000){
            this.M = num;
            this.slots = new Array(num);
        }
    }
Copier après la connexion
Fonction de hachage

Traite le Fonction de hachage de chaînes, string est utilisé ici car il est plus général de convertir des valeurs en chaînes

Convertissez d'abord la valeur de clé transmise en chaîne Afin d'être plus rigoureux,

.

convertir les caractères Convertissez la chaîne en tableau, par exemple, 'abc' => [...'abc'] => 🎜>Convertissez le charCodeAt de chaque caractère séparément Calcul, le reste de M est considéré comme correspondant au nombre d'emplacements Vous n'avez que 10 emplacements au total. Votre valeur %10 tombera certainement dans les emplacements de 0 à 9

.

Ajouter

    h(str){
        str = str + '';
        return [...str].reduce((hash,c)=>{
            hash = (331 * hash + c.charCodeAt()) % this.M;
            return hash;
        },0)
    }
Copier après la connexion
Appelez la fonction de hachage pour obtenir l'adresse de stockage correspondante (qui est l'emplacement de notre analogie)

Car il peut y avoir plusieurs valeurs stockées dans un emplacement , il doit être représenté par un tableau à deux dimensions. Par exemple, nous avons calculé que le numéro d'emplacement de l'emplacement entrant est 0, ce qui est slot[0], alors nous devrions le stocker dans slot[0][0]. le numéro d'emplacement qui arrive plus tard est également l'emplacement numéroté 0, alors nous devrions aller à slot[0][1] Stocker dans

Supprimer

    add(key,value) {
        const h = this.h(key);
        // 判断这个槽是否是一个二维数组, 不是则创建二维数组
        if(!this.slots[h]){
            this.slots[h] = [];
        }
        // 将值添加到对应的槽中
        this.slots[h].push(value);
    }
Copier après la connexion
Utilisez l'algorithme de hachage pour trouver l'emplacement

Supprimer par filtrage

Rechercher

    delete(key){
        const h = this.h(key);
        this.slots[h] = this.slots[h].filter(item=>item.key!==key);
    }
Copier après la connexion
Trouver l'emplacement correspondant grâce à l'algorithme de hachage

Utilisez la fonction de recherche pour trouver la valeur de la même clé

Renvoyer la valeur correspondante

    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;    
    }
Copier après la connexion

总结

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

补充一个小知识点

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


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comparez des structures de données complexes à l'aide de la comparaison de fonctions Java Comparez des structures de données complexes à l'aide de la comparaison de fonctions Java Apr 19, 2024 pm 10:24 PM

Lors de l'utilisation de structures de données complexes en Java, Comparator est utilisé pour fournir un mécanisme de comparaison flexible. Les étapes spécifiques comprennent : la définition d’une classe de comparaison et la réécriture de la méthode de comparaison pour définir la logique de comparaison. Créez une instance de comparaison. Utilisez la méthode Collections.sort, en transmettant les instances de collection et de comparateur.

Structures de données et algorithmes Java : explication détaillée Structures de données et algorithmes Java : explication détaillée May 08, 2024 pm 10:12 PM

Les structures de données et les algorithmes sont à la base du développement Java. Cet article explore en profondeur les structures de données clés (telles que les tableaux, les listes chaînées, les arbres, etc.) et les algorithmes (tels que le tri, la recherche, les algorithmes graphiques, etc.) en Java. Ces structures sont illustrées par des exemples pratiques, notamment l'utilisation de tableaux pour stocker les scores, de listes chaînées pour gérer les listes de courses, de piles pour implémenter la récursion, de files d'attente pour synchroniser les threads, ainsi que d'arbres et de tables de hachage pour une recherche et une authentification rapides. Comprendre ces concepts vous permet d'écrire du code Java efficace et maintenable.

Compréhension approfondie des types de référence en langage Go Compréhension approfondie des types de référence en langage Go Feb 21, 2024 pm 11:36 PM

Les types de référence sont un type de données spécial dans le langage Go. Leurs valeurs ne stockent pas directement les données elles-mêmes, mais l'adresse des données stockées. Dans le langage Go, les types de référence incluent des tranches, des cartes, des canaux et des pointeurs. Une compréhension approfondie des types de référence est cruciale pour comprendre les méthodes de gestion de la mémoire et de transfert de données du langage Go. Cet article combinera des exemples de code spécifiques pour présenter les caractéristiques et l'utilisation des types de référence dans le langage Go. 1. Tranches Les tranches sont l'un des types de référence les plus couramment utilisés dans le langage Go.

Structure de données PHP : l'équilibre des arborescences AVL, maintenant une structure de données efficace et ordonnée Structure de données PHP : l'équilibre des arborescences AVL, maintenant une structure de données efficace et ordonnée Jun 03, 2024 am 09:58 AM

L'arbre AVL est un arbre de recherche binaire équilibré qui garantit des opérations de données rapides et efficaces. Pour atteindre l'équilibre, il effectue des opérations de virage à gauche et à droite, en ajustant les sous-arbres qui violent l'équilibre. Les arbres AVL utilisent l'équilibrage de hauteur pour garantir que la hauteur de l'arbre est toujours petite par rapport au nombre de nœuds, réalisant ainsi des opérations de recherche de complexité temporelle logarithmique (O (logn)) et maintenant l'efficacité de la structure de données même sur de grands ensembles de données.

Analyse complète du cadre de collecte Java : disséquer la structure des données et révéler le secret d'un stockage efficace Analyse complète du cadre de collecte Java : disséquer la structure des données et révéler le secret d'un stockage efficace Feb 23, 2024 am 10:49 AM

Présentation de Java Collection Framework L'infrastructure de collection Java est une partie importante du langage de programmation Java. Elle fournit une série de bibliothèques de classes conteneur qui peuvent stocker et gérer des données. Ces bibliothèques de classes de conteneurs ont différentes structures de données pour répondre aux besoins de stockage et de traitement des données dans différents scénarios. L'avantage du framework de collection est qu'il fournit une interface unifiée, permettant aux développeurs d'exploiter différentes bibliothèques de classes de conteneurs de la même manière, réduisant ainsi la difficulté de développement. Structures de données de l'infrastructure de collection Java L'infrastructure de collection Java contient diverses structures de données, chacune ayant ses propres caractéristiques et scénarios applicables. Voici plusieurs structures de données courantes du cadre de collection Java : 1. Liste : Liste est une collection ordonnée qui permet de répéter des éléments. Li

L'ère de l'IA de JS est arrivée ! L'ère de l'IA de JS est arrivée ! Apr 08, 2024 am 09:10 AM

Introduction à JS-Torch JS-Torch est une bibliothèque JavaScript d'apprentissage en profondeur dont la syntaxe est très similaire à celle de PyTorch. Il contient un objet tensoriel entièrement fonctionnel (peut être utilisé avec des dégradés suivis), des couches et des fonctions d'apprentissage en profondeur et un moteur de différenciation automatique. JS-Torch convient à la recherche sur l'apprentissage profond en JavaScript et fournit de nombreux outils et fonctions pratiques pour accélérer le développement de l'apprentissage profond. Image PyTorch est un framework d'apprentissage profond open source développé et maintenu par l'équipe de recherche de Meta. Il fournit un riche ensemble d'outils et de bibliothèques pour créer et former des modèles de réseaux neuronaux. PyTorch est conçu pour être simple, flexible et facile à utiliser, et ses fonctionnalités de graphique de calcul dynamique font

Comparaison de Golang et Node.js dans le développement back-end Comparaison de Golang et Node.js dans le développement back-end Jun 03, 2024 pm 02:31 PM

Go et Node.js présentent des différences en termes de typage (fort/faible), de concurrence (goroutine/boucle d'événement) et de garbage collection (automatique/manuel). Go a un débit élevé et une faible latence, et convient aux backends à charge élevée ; Node.js est bon pour les E/S asynchrones et convient à une concurrence élevée et à des requêtes courtes. Les cas pratiques des deux incluent Kubernetes (Go), la connexion à une base de données (Node.js) et les applications Web (Go/Node.js). Le choix final dépend des besoins de l'application, des compétences de l'équipe et des préférences personnelles.

La structure de données basée sur une table de hachage optimise les calculs d'intersection et d'union des tableaux PHP La structure de données basée sur une table de hachage optimise les calculs d'intersection et d'union des tableaux PHP May 02, 2024 pm 12:06 PM

La table de hachage peut être utilisée pour optimiser les calculs d'intersection et d'union de tableaux PHP, réduisant ainsi la complexité temporelle de O(n*m) à O(n+m). Les étapes spécifiques sont les suivantes : Utilisez une table de hachage pour mapper les éléments de. le premier tableau à une valeur booléenne pour déterminer rapidement si l'élément du deuxième tableau existe et améliorer l'efficacité du calcul d'intersection. Utilisez une table de hachage pour marquer les éléments du premier tableau comme existants, puis ajoutez les éléments du deuxième tableau un par un, en ignorant les éléments existants pour améliorer l'efficacité des calculs d'union.

See all articles