Table des matières
Implémentation d'images en JavaScript
Créer une classe de graphiques
Ajouter des sommets
Ajouter des bords
Imprimer le graphique
Exemple
Sortie
Supprimer le bord
Supprimer des sommets
Méthode de parcours graphique
A. Recherche en largeur d'abord (BFS)
B. Recherche en profondeur d'abord
Conclusion
Maison interface Web js tutoriel Implémentation de graphiques en JavaScript

Implémentation de graphiques en JavaScript

Sep 13, 2023 pm 12:49 PM

JavaScript 中图的实现

Un graphe est une structure de données non linéaire qui représente un ensemble de sommets (également appelés nœuds) et les relations (ou arêtes) entre eux. Les sommets représentent des entités ou des objets, tandis que les edges représentent des relations ou des connexions entre les sommets. Les graphiques peuvent être utilisés pour modéliser de nombreux types de relations, tels que les réseaux sociaux, les systèmes de transport ou les flux d'informations.

Il existe deux principaux types de graphiques : les graphes orientés (également appelés graphes orientés) et les graphes non orientés. Dans un graphe orienté, les arêtes ont une direction et ne peuvent être parcourues que dans une seule direction, c'est-à-dire du sommet de départ au sommet de fin. Dans un graphe non orienté, les arêtes n’ont pas de direction et peuvent être parcourues dans les deux sens.

Implémentation d'images en JavaScript

Les graphiques peuvent être implémentés à l'aide de matrices de contiguïté ou de listes de contiguïté. Ici, nous allons implémenter des graphiques en JavaScript en utilisant des listes de contiguïté.

Créer une classe de graphiques

Ici, nous créons un plan de la classe graphique.

class Graph {
   constructor() {
      this.adjacencyList = {};
   }
}
Copier après la connexion

Ajouter des sommets

Cette fonction ajoute un nouveau sommet (ou nœud) au graphique en créant une nouvelle clé dans l'objet adjacencyList et en donnant un tableau vide comme valeur. Le nouveau sommet servira de clé et le tableau vide sera utilisé pour stocker ses voisins.

addVertex(vertex) {
   if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
}
Copier après la connexion

Ajouter des bords

Cette fonction ajoute une nouvelle arête entre deux sommets. Il accepte deux paramètres : sommet1 et sommet2, et ajoute le sommet2 au tableau des voisins du sommet1 et vice versa. Cela crée une connexion entre les deux sommets.

addEdge(vertex1, vertex2) {
   this.adjacencyList[vertex1].push(vertex2);
   this.adjacencyList[vertex2].push(vertex1);
}
Copier après la connexion

Imprimer le graphique

Cette fonction enregistre le graphique sur la console. Il parcourt chaque sommet de l'objet adjacencyList et enregistre le sommet et ses voisins.

print() {
   for (const [vertex, edges] of Object.entries(this.adjacencyList)) {
      console.log(`${vertex} -> ${edges.join(", ")}`);
   }
}
Copier après la connexion

Exemple

Dans l'exemple ci-dessous, nous définissons un graphique et ajoutons des sommets et des arêtes au graphique. Imprimez enfin le tableau.

class Graph {
   constructor() {
      this.adjacencyList = {};
   }
   addVertex(vertex) {
      if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
   }
   addEdge(vertex1, vertex2) {
      this.adjacencyList[vertex1].push(vertex2);
      this.adjacencyList[vertex2].push(vertex1);
   }
   print() {
      for (const [vertex, edges] of Object.entries(this.adjacencyList)) {
         console.log(`${vertex} -> ${edges.join(", ")}`);
      }
   }
}
const graph = new Graph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("B", "D");
graph.addEdge("C", "D");
console.log("Graph:");
graph.print();
Copier après la connexion

Sortie

Graph:
A -> B, C
B -> A, D
C -> A, D
D -> B, C
Copier après la connexion

Supprimer le bord

Cette fonction supprime le bord entre deux sommets. Il prend deux paramètres : vertex1 et vertex2, et filtre le vertex2 du tableau voisin de vertex1 et vice versa.

removeEdge(vertex1, vertex2) {
   this.adjacencyList[vertex1] = this.adjacencyList[vertex1].filter(
      (v) => v !== vertex2
   );
   this.adjacencyList[vertex2] = this.adjacencyList[vertex2].filter(
      (v) => v !== vertex1
   );
}
Copier après la connexion

Supprimer des sommets

Cette fonction supprime un sommet du graphique. Il prend un argument de sommet et supprime d'abord toutes les arêtes connectées à ce sommet. Ensuite, il supprime la clé de l’objet adjacencyList.

removeVertex(vertex) {
   while (this.adjacencyList[vertex].length) {
      const adjacentVertex = this.adjacencyList[vertex].pop();
      this.removeEdge(vertex, adjacentVertex);
   }
   delete this.adjacencyList[vertex];
}
Copier après la connexion

Exemple

Dans l'exemple ci-dessous, nous définissons un graphique et ajoutons des sommets et des arêtes, puis imprimons le graphique. Nous supprimons une arête AC du graphique et imprimons enfin le graphique résultant.

class Graph {
   constructor() {
      this.adjacencyList = {};
   }
   addVertex(vertex) {
      if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
   }
   addEdge(vertex1, vertex2) {
      this.adjacencyList[vertex1].push(vertex2);
      this.adjacencyList[vertex2].push(vertex1);
   }
   removeEdge(vertex1, vertex2) {
      this.adjacencyList[vertex1] = this.adjacencyList[vertex1].filter(
         (v) => v !== vertex2
      );
      this.adjacencyList[vertex2] = this.adjacencyList[vertex2].filter(
         (v) => v !== vertex1
      );
   }
   removeVertex(vertex) {
      while (this.adjacencyList[vertex].length) {
         const adjacentVertex = this.adjacencyList[vertex].pop();
         this.removeEdge(vertex, adjacentVertex);
      }
      delete this.adjacencyList[vertex];
   }
   print() {
      for (const [vertex, edges] of Object.entries(this.adjacencyList)) {
         console.log(`${vertex} -> ${edges.join(", ")}`);
      }
   }
}
const graph = new Graph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("B", "D");
graph.addEdge("C", "D");
console.log("Initial Graph:");
graph.print();
console.log("Graph after removal of edge AC:")
graph.removeEdge("A","C");
graph.print();
Copier après la connexion

Sortie

Initial Graph:
A -> B, C
B -> A, D
C -> A, D
D -> B, C
Graph after removal of edge AC:
A -> B
B -> A, D
C -> D
D -> B, C
Copier après la connexion

Méthode de parcours graphique

Le parcours de graphique fait référence au processus de visite de tous les sommets (ou nœuds) d'un graphique et de traitement des informations qui leur sont associées. Le parcours graphique est une opération importante dans les algorithmes graphiques et est utilisé pour des tâches telles que la recherche du chemin le plus court entre deux nœuds, la détection de cycles et la recherche de composants connectés.

Il existe deux méthodes principales pour le parcours graphique : la recherche en largeur d'abord (BFS) et la recherche en profondeur en premier (DFS)

A. Recherche en largeur d'abord (BFS)

Il est implémenté à l'aide de la fonction widthFirstSearch(). Cette fonction implémente l'algorithme de recherche en largeur d'abord et prend le paramètre de départ, qui est le sommet de départ. Il utilise une file d'attente pour garder une trace des sommets à visiter, un tableau de résultats pour stocker les sommets visités et un objet de visite pour garder une trace des sommets déjà visités. La fonction ajoute d'abord le sommet de départ à la file d'attente et le marque comme visité. Ensuite, lorsque la file d'attente n'est pas vide, il prend le premier sommet de la file d'attente, l'ajoute au tableau de résultats et le marque comme visité. Il ajoute ensuite tous les voisins non visités à la file d'attente. Ce processus se poursuit jusqu'à ce que tous les sommets aient été visités et que le tableau résultant soit renvoyé comme résultat du BFS.

breadthFirstSearch(start) {
   const queue = [start];
   const result = [];
   const visited = {};
   let currentVertex;
   visited[start] = true;
   while (queue.length) {
      currentVertex = queue.shift();
      result.push(currentVertex);
         this.adjacencyList[currentVertex].forEach((neighbor) => {
            if (!visited[neighbor]) {
               visited[neighbor] = true;
               queue.push(neighbor);
            }
         });
      }
      return result;
   }
}
Copier après la connexion

B. Recherche en profondeur d'abord

La méthode de recherche en profondeur d'abord implémente l'algorithme DFS en utilisant la fonction interne récursive dfs qui prend les sommets comme paramètres. La fonction utilise l'objet visité pour garder une trace des sommets visités et ajoute chaque sommet visité au tableau de résultats. La fonction marque d'abord le sommet actuel comme visité et l'ajoute au tableau de résultats. Il parcourt ensuite tous les voisins du sommet actuel et appelle récursivement la fonction dfs pour chaque voisin non visité. Ce processus se poursuit jusqu'à ce que tous les sommets aient été visités et que le tableau résultant soit renvoyé comme résultat de DFS.

depthFirstSearch(start) {
   const result = [];
   const visited = {};
   const adjacencyList = this.adjacencyList;
   (function dfs(vertex) {
      if (!vertex) return null;
      visited[vertex] = true;
      result.push(vertex);
      adjacencyList[vertex].forEach(neighbor => {
         if (!visited[neighbor]) {
            return dfs(neighbor);
         }
      });
   })(start);
   return result;
}
Copier après la connexion

Exemple

Dans l'exemple ci-dessous, nous démontrons la recherche en largeur d'abord (BFS) et la recherche en profondeur en premier (DFS).

class Graph {
   constructor() {
      this.adjacencyList = {};
   }
   addVertex(vertex) {
      if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
   }
   addEdge(vertex1, vertex2) {
      this.adjacencyList[vertex1].push(vertex2);
      this.adjacencyList[vertex2].push(vertex1);
   }
   print() {
      for (const [vertex, edges] of Object.entries(this.adjacencyList)) {
         console.log(`${vertex} -> ${edges.join(", ")}`);
      }
   }
   breadthFirstSearch(start) {
      const queue = [start];
      const result = [];
      const visited = {};
      let currentVertex;
      visited[start] = true;
      while (queue.length) {
         currentVertex = queue.shift();
         result.push(currentVertex);
         this.adjacencyList[currentVertex].forEach((neighbor) => {
            if (!visited[neighbor]) {
               visited[neighbor] = true;
               queue.push(neighbor);
            }
         });
      }
      return result;
   }
   depthFirstSearch(start) {
      const result = [];
      const visited = {};
      const adjacencyList = this.adjacencyList;
      (function dfs(vertex) {
         if (!vertex) return null;
         visited[vertex] = true;
         result.push(vertex);
         adjacencyList[vertex].forEach(neighbor => {
            if (!visited[neighbor]) {
               return dfs(neighbor);
            }
         });
      })(start);
      return result;
   }
}
const graph = new Graph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("B", "D");
graph.addEdge("C", "D");
console.log("Initial Graph:");
graph.print();
console.log("BFS: "+graph.breadthFirstSearch('A'));
console.log("DFS: "+graph.depthFirstSearch('A'));
Copier après la connexion

Sortie

Initial Graph:
A -> B, C
B -> A, D
C -> A, D
D -> B, C
BFS: A,B,C,D
DFS: A,B,D,C
Copier après la connexion

Conclusion

Un graphique est une structure de données utile qui peut être utilisée pour représenter les relations et les connexions entre des objets. L'implémentation de graphiques en JavaScript peut être effectuée à l'aide de diverses techniques, notamment l'utilisation de listes de contiguïté ou de matrices de contiguïté. La classe Graph présentée dans cette réponse utilise une représentation de liste de contiguïté, où chaque sommet est stocké en tant que clé dans un objet et son arête correspondante est stockée en tant que valeur de cette clé dans un tableau.

La classe Graph implémente des méthodes pour ajouter des sommets et des arêtes à un graphique, imprimer le graphique et effectuer des traversées de recherche en profondeur et en largeur.

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)

Que dois-je faire si je rencontre l'impression de code brouillé pour les reçus en papier thermique frontal? Que dois-je faire si je rencontre l'impression de code brouillé pour les reçus en papier thermique frontal? Apr 04, 2025 pm 02:42 PM

Des questions et des solutions fréquemment posées pour l'impression de billets thermiques frontaux pour le développement frontal, l'impression de billets est une exigence commune. Cependant, de nombreux développeurs mettent en œuvre ...

Qui est payé plus de python ou de javascript? Qui est payé plus de python ou de javascript? Apr 04, 2025 am 12:09 AM

Il n'y a pas de salaire absolu pour les développeurs Python et JavaScript, selon les compétences et les besoins de l'industrie. 1. Python peut être davantage payé en science des données et en apprentissage automatique. 2. JavaScript a une grande demande dans le développement frontal et complet, et son salaire est également considérable. 3. Les facteurs d'influence comprennent l'expérience, la localisation géographique, la taille de l'entreprise et les compétences spécifiques.

Démystifier javascript: ce qu'il fait et pourquoi c'est important Démystifier javascript: ce qu'il fait et pourquoi c'est important Apr 09, 2025 am 12:07 AM

JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en utilisant JavaScript? Comment fusionner les éléments du tableau avec le même ID dans un seul objet en utilisant JavaScript? Apr 04, 2025 pm 05:09 PM

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en JavaScript? Lors du traitement des données, nous rencontrons souvent la nécessité d'avoir le même ID ...

Comment réaliser des effets de défilement de parallaxe et d'animation des éléments, comme le site officiel de Shiseido?
ou:
Comment pouvons-nous réaliser l'effet d'animation accompagné d'un défilement de page comme le site officiel de Shiseido? Comment réaliser des effets de défilement de parallaxe et d'animation des éléments, comme le site officiel de Shiseido? ou: Comment pouvons-nous réaliser l'effet d'animation accompagné d'un défilement de page comme le site officiel de Shiseido? Apr 04, 2025 pm 05:36 PM

La discussion sur la réalisation des effets de défilement de parallaxe et d'animation des éléments dans cet article explorera comment réaliser le site officiel de Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ...

La différence dans Console.Log de sortie Résultat: Pourquoi les deux appels sont-ils différents? La différence dans Console.Log de sortie Résultat: Pourquoi les deux appels sont-ils différents? Apr 04, 2025 pm 05:12 PM

Discussion approfondie des causes profondes de la différence de sortie Console.log. Cet article analysera les différences dans les résultats de sortie de la fonction Console.log dans un morceau de code et expliquera les raisons derrière. � ...

JavaScript est-il difficile à apprendre? JavaScript est-il difficile à apprendre? Apr 03, 2025 am 12:20 AM

Apprendre JavaScript n'est pas difficile, mais c'est difficile. 1) Comprendre les concepts de base tels que les variables, les types de données, les fonctions, etc. 2) Master la programmation asynchrone et les implémenter via des boucles d'événements. 3) Utilisez les opérations DOM et promettez de gérer les demandes asynchrones. 4) Évitez les erreurs courantes et utilisez des techniques de débogage. 5) Optimiser les performances et suivre les meilleures pratiques.

PowerPoint peut-il exécuter JavaScript? PowerPoint peut-il exécuter JavaScript? Apr 01, 2025 pm 05:17 PM

JavaScript peut être exécuté dans PowerPoint et peut être implémenté en appelant des fichiers JavaScript externes ou en intégrant des fichiers HTML via VBA. 1. Pour utiliser VBA pour appeler les fichiers JavaScript, vous devez activer les macros et avoir des connaissances en programmation VBA. 2. ENCHED des fichiers HTML contenant JavaScript, qui sont simples et faciles à utiliser mais sont soumis à des restrictions de sécurité. Les avantages incluent les fonctions étendues et la flexibilité, tandis que les inconvénients impliquent la sécurité, la compatibilité et la complexité. En pratique, l'attention doit être accordée à la sécurité, à la compatibilité, aux performances et à l'expérience utilisateur.

See all articles