


Introduction à la structure de données d'ensembles disjoints ou à l'algorithme de recherche d'union
La structure d'information des ensembles disjoints, également connue sous le nom d'algorithme de recherche d'union, est probablement un concept fondamental en informatique, qui fournit une méthode efficace pour résoudre les problèmes liés à l'allocation et à la mise en réseau. Il est particulièrement utile pour résoudre des problèmes impliquant des ensembles de composants et déterminer leurs connexions. Dans cet article, nous examinerons les constructions de langage, les algorithmes et deux manières uniques d'implémenter des structures d'informations d'ensembles disjoints en C++. Nous fournirons également des exemples de code entièrement exécutables illustrant ces méthodes.
Grammaire
Avant d'entrer dans l'algorithme, familiarisons-nous avec la syntaxe utilisée dans les exemples de code suivants -
// Create a disjoint set DisjointSet ds(n); // Perform union operation ds.unionSets(a, b); // Find the representative of a set ds.findSet(x);
Algorithme
Exploiter des structures de données disjointes peut être très utile lorsqu'il s'agit de plusieurs collections disjointes. Chaque groupement individuel se voit attribuer un représentant spécifique pour le caractériser. Le point de départ implique que chaque composant forme son propre ensemble isolé, qui correspond à son représentant respectif (qui se trouve aussi être lui-même). Les deux principales opérations effectuées sur des ensembles disjoints sont l'union et la recherche.
Opération conjointe
Trouvez les représentants des deux ensembles que vous souhaitez fusionner.
Si les délégués sont différents, faites valoir un point sur l'autre, fusionnant ainsi efficacement les ensembles.
Si les représentants sont les mêmes, les ensembles ont été fusionnés et aucune autre action n'est requise.
Trouver une opération
Étant donné un élément, trouvez le représentant de l'ensemble auquel il appartient.
Suivez le pointeur parent jusqu'à ce qu'il atteigne le nœud représentatif.
Renvoyez le délégué comme résultat.
Méthode 1 : Fusion basée sur le classement et compression de chemin
Un moyen efficace d'implémenter des structures de données d'ensembles disjoints consiste à utiliser des techniques d'union par rang et de compression de chemin.
Dans cette méthode, chaque collection a un rang associé, initialement fixé à 0.
Lors de l'exécution d'une opération d'union entre deux ensembles, l'ensemble le mieux classé est prioritaire et l'ensemble le moins bien classé est fusionné. Si deux ensembles ont des rangs similaires, il faut choisir arbitrairement quel ensemble contient qui. Dans les deux cas, une fois fusionné dans un nouvel ensemble, son rang augmente de 1. De plus, pour accélérer les opérations de recherche et réduire la complexité temporelle, la compression des chemins permet d'aplatir la structure arborescente au cours de ces opérations.
La traduction chinoise deExemple
est :Exemple
#include <iostream> #include <vector> class DisjointSet { std::vector<int> parent; std::vector<int> rank; public: DisjointSet(int n) { parent.resize(n); rank.resize(n, 0); for (int i = 0; i < n; ++i) parent[i] = i; } int findSet(int x) { if (parent[x] != x) parent[x] = findSet(parent[x]); return parent[x]; } void unionSets(int x, int y) { int xRoot = findSet(x); int yRoot = findSet(y); if (xRoot == yRoot) return; if (rank[xRoot] < rank[yRoot]) parent[xRoot] = yRoot; else if (rank[xRoot] > rank[yRoot]) parent[yRoot] = xRoot; else { parent[yRoot] = xRoot; rank[xRoot]++; } } }; int main() { // Example usage of DisjointSet int n = 5; // Number of elements DisjointSet ds(n); ds.unionSets(0, 1); ds.unionSets(2, 3); ds.unionSets(3, 4); std::cout << ds.findSet(0) << std::endl; std::cout << ds.findSet(2) << std::endl; return 0; }
Sortie
0 2
Méthode 2 : Fusion basée sur la taille avec compression de taille et de chemin
Une autre façon de gérer les structures de données d'ensembles disjoints consiste à utiliser des techniques de fusion par taille et de compression de chemin.
Dans cette méthode, chaque collection a une taille associée, initialement fixée à 1.
Dans une opération syndicale, les ensembles plus petits sont fusionnés en ensembles plus grands.
La taille de l'ensemble de résultats sera mise à jour en conséquence.
Appliquez une compression de chemin pendant l'opération de recherche pour aplatir la structure arborescente, similaire à la méthode précédente.
Exemple
est :Exemple
#include <iostream> #include <vector> class DisjointSet { std::vector<int> parent; std::vector<int> size; public: DisjointSet(int n) { parent.resize(n); size.resize(n, 1); for (int i = 0; i < n; ++i) parent[i] = i; } int findSet(int x) { if (parent[x] != x) parent[x] = findSet(parent[x]); return parent[x]; } void unionSets(int x, int y) { int xRoot = findSet(x); int yRoot = findSet(y); if (xRoot == yRoot) return; if (size[xRoot] < size[yRoot]) { parent[xRoot] = yRoot; size[yRoot] += size[xRoot]; } else { parent[yRoot] = xRoot; size[xRoot] += size[yRoot]; } } }; int main() { // Example usage of DisjointSet int n = 5; // Number of elements DisjointSet ds(n); ds.unionSets(0, 1); ds.unionSets(2, 3); ds.unionSets(3, 4); std::cout << ds.findSet(0) << std::endl; std::cout << ds.findSet(2) << std::endl; return 0; }
Sortie
0 2
Conclusion
La structure de données d'ensembles disjoints ou algorithme de recherche d'union est un outil puissant pour résoudre les problèmes impliquant les ensembles et la connectivité. Cet article étudie en profondeur la syntaxe de la structure de données des ensembles disjoints du C++ et ses algorithmes. Pour élargir notre compréhension, nous proposons aux lecteurs deux approches uniques : l'union basée sur le classement combinée à la compression du chemin, et l'union basée sur la taille via la compression de la taille et du chemin. En comprenant et en mettant en œuvre ces méthodes, vous pouvez résoudre efficacement divers problèmes nécessitant le suivi d’ensembles disjoints.
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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.

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

Une étude approfondie des mystères de la structure des données du langage Go nécessite des exemples de code spécifiques. En tant que langage de programmation concis et efficace, le langage Go montre également son charme unique dans le traitement des structures de données. La structure des données est un concept de base en informatique, qui vise à organiser et gérer les données afin qu'elles puissent être consultées et manipulées plus efficacement. En apprenant en profondeur les mystères de la structure des données du langage Go, nous pouvons mieux comprendre comment les données sont stockées et exploitées, améliorant ainsi l'efficacité de la programmation et la qualité du code. 1. Array Array est l'une des structures de données les plus simples

JavaMap est une structure de données basée sur des paires clé-valeur qui permet aux développeurs de stocker et de récupérer rapidement des données. Les clés d'une Map peuvent être n'importe quel objet et les valeurs peuvent être n'importe quel type de données. Chaque clé de la Map ne peut être associée qu'à au plus une valeur. Si plusieurs valeurs sont définies pour la même clé, seule la dernière valeur définie sera conservée. Il existe deux implémentations principales de Map : HashMap : utilise une table de hachage pour stocker les paires clé-valeur. Les performances de HashMap dépendent de la manière dont la table de hachage est implémentée et, dans la plupart des cas, HashMap fonctionne mieux que TreeMap. TreeMap : utilise des arbres rouge-noir pour stocker les paires clé-valeur. Les performances de TreeMap sont similaires à celles de HashMap, mais dans certains cas, les performances de TreeMap peuvent être

Présentation de la bibliothèque de structures de données PHPSPL La bibliothèque de structures de données PHPSPL (Standard PHP Library) contient un ensemble de classes et d'interfaces pour stocker et manipuler diverses structures de données. Ces structures de données comprennent des tableaux, des listes chaînées, des piles, des files d'attente et des ensembles, chacun fournissant un ensemble spécifique de méthodes et de propriétés pour manipuler les données. Tableaux En PHP, un tableau est une collection ordonnée qui stocke une séquence d'éléments. La classe de tableau SPL fournit des fonctions améliorées pour les tableaux PHP natifs, notamment le tri, le filtrage et le mappage. Voici un exemple d'utilisation de la classe array SPL : useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array
