Maison interface Web js tutoriel js implémente la structure des données : arbre et arbre binaire, traversée d'arbre binaire et méthodes de fonctionnement de base

js implémente la structure des données : arbre et arbre binaire, traversée d'arbre binaire et méthodes de fonctionnement de base

Sep 22, 2017 am 09:55 AM
javascript Opérations de base 数据结构

La structure arborescente est un type très important de structure non linéaire. Intuitivement, une structure arborescente est une structure hiérarchique définie par des relations de branchement.

Les arbres sont également largement utilisés dans le domaine informatique. Par exemple, dans les compilateurs, les arbres sont utilisés pour représenter la structure grammaticale du programme source ; dans les systèmes de bases de données, les arbres peuvent être utilisés pour organiser les informations ; comportement des algorithmes, les arbres peuvent être utilisés pour décrire son processus d'exécution, etc.

Tout d'abord, regardons quelques concepts d'arbres : 1. Tree (Tree) est un ensemble fini de n (n>=0) nœuds. Dans tout arbre non vide :

(1) Il n'y a et il n'y a qu'un seul nœud spécifique appelé racine

(2) Lorsque n>1, les nœuds restants peuvent être divisés en m ( m>0) ensembles finis mutuellement disjoints T1, T2, T3,...Tm, dont chacun est lui-même un arbre et est appelé le sous-arbre de la racine.

Par exemple, (a) est un arbre avec un seul nœud racine ; (b) est un arbre avec 13 nœuds, où A est la racine, et les nœuds restants sont divisés en 3 sous-ensembles disjoints : T1= {B,E,F,K,L},t2={D,H,I,J,M};T1, T2 et T3 sont tous des sous-arbres de la racine A et sont eux-mêmes un arbre.
js implémente la structure des données : arbre et arbre binaire, traversée darbre binaire et méthodes de fonctionnement de base

2. Le nœud de l'arbre contient un élément de données et plusieurs branches pointant vers ses sous-arbres. Le nombre de sous-arbres que possède un nœud est appelé le degré du nœud. Par exemple, dans (b), le degré de A est 3, le degré de C est 1 et le degré de F est 0. Le nœud de degré 0 est appelé nœud feuille ou nœud terminal. Les nœuds avec un degré autre que 0 sont appelés nœuds non terminaux ou nœuds de branche. Le degré d'un arbre est le degré maximum de chaque nœud de l'arbre. Le degré de l’arbre en (b) est 3. La racine du sous-arbre d’un nœud est appelée l’enfant du nœud. En conséquence, ce nœud est appelé le parent de l'enfant. Les enfants des mêmes parents s’appellent frères et sœurs. Les ancêtres d'un nœud sont tous les nœuds des branches allant de la racine au nœud. Au contraire, tout nœud du sous-arbre enraciné sur un nœud est appelé descendant de ce nœud.

3. Le niveau d'un nœud est défini à partir de la racine. La racine est le premier niveau, et les enfants suivants sont le deuxième niveau. Si un nœud est au niveau l, alors la racine de son sous-arbre est au niveau l+1. Les nœuds dont les parents sont au même niveau sont cousins ​​les uns des autres. Par exemple, les nœuds G et E, F, H, I et J sont cousins ​​les uns des autres. Le niveau maximum de nœuds dans l’arborescence est appelé profondeur ou hauteur de l’arborescence. La profondeur de l’arbre en (b) est de 4.

4. Si les sous-arbres des nœuds de l'arbre sont considérés comme ordonnés de gauche à droite (c'est-à-dire qu'ils ne peuvent pas être échangés), alors l'arbre est appelé un arbre ordonné, sinon il est appelé un arbre non ordonné. arbre. Dans un arbre ordonné, la racine du sous-arbre le plus à gauche est appelée le premier enfant et la racine du sous-arbre le plus à droite est appelée le dernier enfant.

5. La forêt est une collection de m (m>=0) arbres disjoints. Pour chaque nœud de l’arbre, l’ensemble de ses sous-arbres constitue la forêt.

Jetons un coup d'œil aux concepts liés aux arbres binaires :

L'arbre binaire est une autre structure arborescente. Sa caractéristique est que chaque nœud a au plus deux sous-arbres (c'est-à-dire qu'il n'y a pas d'arbre binaire). nœud de degré supérieur à 2), et les sous-arbres d'un arbre binaire peuvent être divisés en sous-arbres gauche et droit (l'ordre ne peut pas être inversé arbitrairement.)

Propriétés des arbres binaires :

1 . Dans l'arbre binaire, il y a au plus 2 i-1 nœuds de puissance sur la i-ème couche (i>=1).

2. Un arbre binaire de profondeur k a au plus 2 k-1 nœuds, (k>=1).

 3. Pour tout arbre binaire T, si le nombre de nœuds terminaux est n0 et le nombre de nœuds de degré 2 est n2, alors n0 = n2 + 1;

 La profondeur du l'arbre est k Et un arbre binaire avec 2 k-1 nœuds est appelé un arbre binaire complet.

Un arbre binaire à n nœuds de profondeur k, si et seulement si chacun de ses nœuds correspond aux nœuds numérotés de 1 à n dans l'arbre binaire complet de profondeur k.

Voici deux caractéristiques d'un arbre binaire complet :

4. La profondeur d'un arbre binaire complet avec n nœuds est Math.floor(log 2 n) + 1

5. Si les nœuds d'un arbre binaire complet à n nœuds (sa profondeur est Math.floor(log 2 n) + 1) sont numérotés dans l'ordre des couches (du 1er niveau au Math.floor(2 n) + 1, chaque couche de gauche à droite), puis pour tout nœud (1

 (1) Si i=1, alors le nœud i est un arbre binaire Racine, pas de parents ; si i>1, alors son parent(i) est le nœud Math.floor(i/2).

 (2) Si 2i > n, alors le nœud i n'a plus d'enfant gauche (le nœud i est un nœud feuille sinon son enfant gauche LChild(i) est le nœud 2i.

  (3) Si 2i + 1 > n, alors le nœud i n'a pas d'enfant droit ; sinon son enfant droit RChild(i) est le nœud 2i + 1 ; 🎜>

Structure de stockage de l'arbre binaire

1. Structure de stockage séquentielle
Utilisez un ensemble d'unités de stockage continues pour stocker les éléments de nœud sur l'arbre binaire complet de haut en bas et de gauche à droite, c'est-à-dire l'élément de nœud numéroté i sur l'arbre binaire. est stocké dans le composant In avec l'indice i-1 dans le tableau unidimensionnel défini ci-dessus. "0" indique que ce nœud n'existe pas. Cette structure de stockage séquentielle ne convient qu'aux arbres binaires complets.
Parce que, dans le pire des cas, un arbre à une seule branche de profondeur k et seulement k nœuds (il n'y a pas de nœud de degré 2 dans l'arbre) nécessite une longueur de 2 à la nième puissance -1 tableau dimensionnel.

2. Structure de stockage liée
Le nœud d'un arbre binaire est constitué d'un élément de données et de deux branches pointant respectivement vers ses sous-arbres gauche et droit, ce qui signifie que les nœuds de la liste liée de l'arbre binaire contenir au moins trois champs : champ de données et champs de pointeur gauche et droit. Parfois, afin de faciliter la recherche des parents d'un nœud, un champ de pointeur pointant vers son nœud parent peut être ajouté à la structure du nœud. Les structures de stockage des arbres binaires obtenues en utilisant ces deux structures sont appelées respectivement listes chaînées binaires et listes chaînées triples.
Il y a n+1 champs de lien vides dans une liste chaînée binaire contenant n nœuds. Nous pouvons utiliser ces champs de lien vides pour stocker d'autres informations utiles, obtenant ainsi une autre structure de stockage liée - la liste chaînée d'indices.

Il existe trois principaux types de parcours d'arbre binaire :

Parcours du premier ordre (racine) : racine gauche et droite
Parcours de l'ordre intermédiaire (racine) : racine gauche droite
Retour Ordre (racine) Traversée : racines gauche et droite

Structure de stockage séquentielle de l'arbre binaire :

js implémente la structure des données : arbre et arbre binaire, traversée darbre binaire et méthodes de fonctionnement de base

Forme de stockage en chaîne de l'arbre binaire :

js implémente la structure des données : arbre et arbre binaire, traversée darbre binaire et méthodes de fonctionnement de base

// 顺序存储结构
    var tree = [1, 2, 3, 4, 5, , 6, , , 7];
    // 链式存储结构
    function BinaryTree(data, leftChild, rightChild) {
        this.data = data || null;
        // 左右孩子结点
        this.leftChild = leftChild || null;
        this.rightChild = rightChild || null;
    }
Copier après la connexion

Traversing Binary Tree : fait référence à la visite de chaque nœud de l'arbre binaire une et une seule fois selon une règle spécifiée.

1. Parcours pré-commandé de l'arbre binaire

1) La définition récursive de l'algorithme est :

Si l'arbre binaire est vide, le parcours se termine sinon ;

 ⑴ Visitez le nœud racine ;

 ⑵ Parcourez le sous-arbre de gauche dans l'ordre (appelez cet algorithme de manière récursive) ;

 ⑶ Parcourez le sous-arbre de droite dans l'ordre (appelez cet algorithme de manière récursive) ; .

Implémentation de l'algorithme :

// 顺序存储结构的递归先序遍历
    var tree = [1, 2, 3, 4, 5, , 6, , , 7];    console.log('preOrder:');
    void function preOrderTraverse(x, visit) {
        visit(tree[x]);
        if (tree[2 * x + 1]) preOrderTraverse(2 * x + 1, visit);
        if (tree[2 * x + 2]) preOrderTraverse(2 * x + 2, visit);
    }(0, function (value) {
        console.log(value);
    });
    // 链式存储结构的递归先序遍历
    BinaryTree.prototype.preOrderTraverse = function preOrderTraverse(visit) {
        visit(this.data);
        if (this.leftChild) preOrderTraverse.call(this.leftChild, visit);
        if (this.rightChild) preOrderTraverse.call(this.rightChild, visit);
    };
Copier après la connexion

2) Algorithme non récursif :

Supposons que T soit une variable pointant vers le nœud racine de l'arbre binaire, le non récursif L'algorithme est : Si l'arbre binaire est vide, alors retournez ; sinon, laissez p=T ; (1) p est le nœud racine

(2) Si p n'est pas vide ou ; la pile n'est pas vide ;

(3) Si p n'est pas vide, accédez au nœud pointé par p, poussez p sur la pile, p = p.leftChild, accédez au sous-arbre de gauche

<🎜 ; > (4) Sinon ; revenez à p, puis p = p.rightChild, accédez au sous-arbre de droite

 (5) Allez à (2) jusqu'à ce que la pile soit vide.

Implémentation du code :

2. Parcours dans l'ordre de l'arbre binaire :

// 链式存储的非递归先序遍历

    // 方法1
    BinaryTree.prototype.preOrder_stack = function (visit) {        
    var stack = new Stack();        
    stack.push(this);        
    while (stack.top) {            
    var p;            // 向左走到尽头
            while ((p = stack.peek())) {
                p.data && visit(p.data);                
                stack.push(p.leftChild);
            }            
            stack.pop();            
            if (stack.top) {
                p = stack.pop();                
                stack.push(p.rightChild);
            }
        }
    };    // 方法2
     BinaryTree.prototype.preOrder_stack2 = function (visit) {        
     var stack = new Stack();        
     var p = this;        
     while (p || stack.top) {            
     if (p) {                
     stack.push(p);
                p.data && visit(p.data);
                p = p.leftChild;
            } else {
                p = stack.pop();
                p = p.rightChild;
            }
        }
    };
Copier après la connexion
1) La définition récursive de l'algorithme est :

Si l'arbre binaire est vide, Alors le parcours se termine ; sinon

 ⑴ Traversez dans l'ordre le sous-arbre gauche (appelez cet algorithme de manière récursive

 ⑵ Visitez le nœud racine

) ;

 ⑶ Parcourez dans l'ordre le sous-arbre droit (appelez cet algorithme de manière récursive).

2) Algorithme non récursif

// 顺序存储结构的递归中序遍历
    var tree = [1, 2, 3, 4, 5, , 6, , , 7];    
    console.log(&#39;inOrder:&#39;);
    void function inOrderTraverse(x, visit) {        
    if (tree[2 * x + 1]) inOrderTraverse(2 * x + 1, visit);
        visit(tree[x]);
        if (tree[2 * x + 2]) inOrderTraverse(2 * x + 2, visit);
    }(0, function (value) {
        console.log(value);
    });

    // 链式存储的递归中序遍历
    BinaryTree.prototype.inPrderTraverse = function inPrderTraverse(visit) {        
    if (this.leftChild) inPrderTraverse.call(this.leftChild, visit);
        visit(this.data);
        if (this.rightChild) inPrderTraverse.call(this.rightChild, visit);
    };
Copier après la connexion
T est une variable pointant vers le nœud racine de l'arbre binaire. L'algorithme non récursif est : Si l'arbre binaire est vide, retourne. ; sinon, let p=T

 ⑴ Si p n'est pas vide, p est poussé sur la pile, p=p.leftChild;

 ⑵ Sinon (c'est-à-dire que p est vide), replacez la pile sur p et accédez à l'objet pointé par p Node, p=p.rightChild;

<br/>
Copier après la connexion
 ⑶ Allez à (1);

 

3. Parcours post-ordre de l'arbre binaire :

<br/>1) Algorithme récursif

// 方法1
    inOrder_stack1: function (visit) {        
    var stack = new Stack();        
    stack.push(this);        
    while (stack.top) {            
    var p;            // 向左走到尽头
            while ((p = stack.peek())) {                
            stack.push(p.leftChild);
            }            
            stack.pop();            
            if (stack.top) {
                p = stack.pop();
                p.data && visit(p.data);                
                stack.push(p.rightChild);
            }
        }
    },    // 方法2
    inOrder_stack2: function (visit) {        
    var stack = new Stack();        
    var p = this;        
    while (p || stack.top) {            
    if (p) {                
    stack.push(p);
                p = p.leftChild;
            } else {
                p = stack.pop();
                p.data && visit(p.data);
                p = p.rightChild;
            }
        }
    },
Copier après la connexion
Si l'arbre binaire est vide, le parcours se termine ; sinon

 ⑴ La post-commande traverse le sous-arbre gauche (appelle récursivement cet algorithme) ;

 ⑶ La post-commande traverse le sous-arbre droit (appelle récursivement cet algorithme) ; Visitez le nœud racine.

2) Algorithme non récursif

Dans le parcours post-ordre, le nœud racine est le dernier visité. Par conséquent, pendant le processus de parcours, lorsque le pointeur de recherche pointe vers un certain nœud racine, il n'est pas accessible immédiatement, mais son sous-arbre gauche doit être parcouru en premier et le nœud racine est poussé sur la pile. Lorsque le nœud racine est recherché après avoir parcouru son sous-arbre gauche, il est toujours inaccessible et son sous-arbre droit doit être traversé. Par conséquent, le nœud racine doit être à nouveau poussé sur la pile. Lorsque son sous-arbre droit est traversé puis réapparu sur la pile, il est accessible. Par conséquent, configurez une marque de variable d'indicateur d'état :

<br/> Mark=0 indique que ce nœud vient d'être accédé, mark=1 indique que le traitement du sous-arbre gauche est terminé et renvoyé,

// 顺序存储结构的递归后序遍历
    var tree = [1, 2, 3, 4, 5, , 6, , , 7];    
    console.log(&#39;postOrder:&#39;);
    void function postOrderTraverse(x, visit) {        
    if (tree[2 * x + 1]) postOrderTraverse(2 * x + 1, visit);
        if (tree[2 * x + 2]) postOrderTraverse(2 * x + 2, visit);
        visit(tree[x]);
    }(0, function (value) {
        console.log(value);
    });
    // 链式存储的递归后序遍历
    BinaryTree.prototype.postOrderTraverse = function postOrderTraverse(visit) {        
    if (this.leftChild) postOrderTraverse.call(this.leftChild, visit);
        if (this.rightChild) postOrderTraverse.call(this.rightChild, visit);
        visit(this.data);
    };
Copier après la connexion
mark= 2 indique que le sous-arbre de droite est traité. Fin du retour. Chaque fois que l'action est décidée en fonction du champ de marque en haut de la pile

Idée d'implémentation de l'algorithme :

 (1) Le nœud racine est poussé dans la pile et mark = 0 ;

 (2 ) Si la pile n'est pas vide, placez-la sur le nœud

(3) Si la marque du nœud = 0, modifiez la marque du nœud actuel à 1, et poussez le sous-arbre gauche sur la pile

(4 ) Si la marque du nœud = 1, modifiez la marque du nœud actuel à 2, et poussez le sous-arbre droit sur la pile

 (5) Si la marque du nœud = 2, accédez à la valeur du nœud actuel

 (6) Terminez jusqu'à ce que la pile soit vide.

 

Un exemple précis

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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

Apprenez en profondeur les secrets des structures de données du langage Go Apprenez en profondeur les secrets des structures de données du langage Go Mar 29, 2024 pm 12:42 PM

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

Structures de données PHP SPL : injectez de la vitesse et de la flexibilité dans vos projets Structures de données PHP SPL : injectez de la vitesse et de la flexibilité dans vos projets Feb 19, 2024 pm 11:00 PM

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

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