EnsiRef

Algorithmique avancé

Cette page essaie de résumer le cours d'algorithmique avancé avec les éléments principaux

#Arbres

#Arbres binaires de recherche (ABR)

83161014

#Structure

typedef struct node {
    int value;
    struct node *leftSubtree, *rightSubtree;
} Node, *BinaryTree;

#Complexités

  • Recherche o(h)
  • Insertion o(h)
  • Suppression o(h)

#Inconvénients

  • Il peut être dégénéré
    • Les complexités deviennent :
      • Recherche o(n)
      • Insertion o(n)
      • Suppression o(n)
8316

#Pseudo-codes

  • Suppression
1) Recherche le noeud n où se toruve k
2) Si n est une feuille, supprimer n
3) Si n n'a pas de fils gauche
   -> Recoller le fils droit
4) Si n n'a pas de fils droit
   -> Recoller le fils gauche
5) Sinon
   a) Aller chercher le max à gauche de n
   b) Le supprimer 
   c) remplacer la valeur de n par le max

#Définitions

Nom Définition
Arbre équilibré |Hauteur gauche - Hauteur droite| est controllée

#Arbres bicolores (rouges-noirs)

251349710NULLNULLNULLNULLNULLNULLNULLNULLNULL

#Propriétés

Un arbre est rouge noir si :

  • Chaque noeud est soit rouge, soit noir
  • Tous les noeuds NULL ainsi que la racine sont noirs;
  • Un noeud rouge n'a pas d'enfant rouge;
  • Tous les chemins d'un noeud à ses descendants NULL traversent le même nombre de sommets noirs (C'est la hauteur noire)

#Structure

typedef struct rbnode {
    int value;
    int color;
    struct rbnode *leftSubtree, *rightSubtree;
    struct rbnode *father ;
} RBNode, *RBBinaryTree;

#Complexités

  • Recherche o(log n)
  • Insertion o(log n)
  • Suppression o(log n)

#Pseudo-code

  • Insertion
1) On insère le noeud comme un ABR classique (il aura la couleur rouge)
2) On regarde si la racine est rouge -> On la change à noire
3) On rééquilibre le noeud que nous venons d'ajouter
  • Rééquilibrage d'un noeud
Le noeud que nous devons rééquilibrer est noté n
1) On regarde si le parent de n est rouge et si n est rouge
    a) Si l'oncle de n est rouge : 
        aa) L'oncle devient noir
        ab) Le parent de n devent noir
        ac) Le parent du parent de n devient rouge
        ad) On rééquilibre le parent du parent de n
    b) Si l'oncle de n est noir
        ba) Si le noeud inséré est full à gauche ou full à droite
            baa) Si le noeud inséré est full à gauche
                On fait une rotation droite à partir du parent du parent de n
            baa) Si le noeud inséré est full à droite
                On fait une rotation gauche à partir du parent du parent de n
        bb) Sinon
            bba) Si le noeud inséré est gauche puis droite
                On fait une rotation gauche à partir du parent de n
                On rééquilibre le fils gauche de n
            bbb) Si le noeud inséré est droite puis gauche
                On fait une rotation droite à partir du parent de n
                On rééquilibre le fils droit de n

Exemples de rééquilibrage de noeud dans le cours

#Définitions

Rotation :

5314653146Rotation droiteRotation gauche

#ABR randomisé (définitions)

83161014

Comme un ABR classique mais on ajoute de l'aléa aux algorithmes d'insertion et de suppression pour éviter les arbres dégénérés

#Structure

typedef struct node {
    int value;
    struct node *leftSubtree, *rightSubtree;
    int size;
} Node, *BinaryTree;

#Complexités

  • Recherche o(log n)
  • Insertion o(log n)
  • Suppression o(log n)

#ABR randomisé (insertion)

#Fonction split

K est le nombre à partir duquel on veut splitter notre arbre.

3 manières de splitter :

  • Si K = racine(Arbre)
516K = 5516
  • Si K > racine(Arbre)
517K = 7.58651786On refait un splitde la partie rouge786On recolle les morceaux5151768
  • Si K < racine(Arbre)
537K = 2On refait un splitde la partie verteOn recolle les morceaux41537415734153741

#Insertion

L'insertion utilise la fonction split et se déroule comme suit :

Insertion(arbre, k)
    taille <- la taille de l'arbre (le nombre de noeud)
    hasard <- calcul d'un nombre au hasard entre 0 et 1
    si hasard < 1/taille + 1 alors
        on insère k à la racine de arbre
            arbreGauche, arbreDroit = split(arbre, k)
            on ajoute k à la racine de arbreDroit
    sinon 
        si k > arbre.valeur
            Insertion(arbre.partieDroite, k)
        sinon
            Insertion(arbre.partieGauche, k)
        fin
    fin

#ABR randomisé (suppression)

#Fonction join

Nous voulons join l'arbre vert et l'arbre rouge suivant :

537412Join

On tire p, un nombre au hasard entre 1 et taille de l'arbre vert + taille de l'arbre rouge

Si p < taille a, la fonction retourne

341572Join

Si p > taille a, la fonction retourne

572341Join

#Fonction suppression

Pour supprimer, on utilise cette fonction :

Suppression(Arbre A, k)
    Si racine(A) = k
        Retourne Join(Arbre.arbreGauche, Arbre.arbreDroit)
    Sinon
        Si racine(A) < k 
            copie = copie(a)
            copie.arbreDroit = supprimer(copie.arbreDroit, k)
            retourne copie
        Sinon
            copie = copie(a)
            copie.arbreGauche = supprimer(copie.arbreGauche, k)
            retourne copie
        Fin
    Fin

#Master Theorem

#Master theorem

Le Master theorem permet de factoriser une complexité. Elle existe en 3 partie.

Si on a une complexité de cette forme :

c(\color{red}{m}\color{black}) = \color{blue}{a} \color{black}\times c (\color{red}{m}\color{black} / \color{green}{b}\color{black}) + f(\color{red}{m}\color{black})

Alors il est possible de factoriser la complexité en fonction de KaTeX:f

#Partie 1

Si KaTeX:f croit lentement : KaTeX:f(\color{red}m\color{black}) \text{est négligeable par rapport à}\\ \color{red}m\color{black}^{log_{\color{blue}b}^{\color{green}a\color{black}}}

Alors il est possible de factoriser c(m) de cette façon :

c(\color{red}m\color{black}) = o(\color{red}m\color{black}^{log_{\color{blue}b}^{\color{green}a\color{black}}})

#Partie 2

Si KaTeX:f croit assez rapidement : KaTeX:f(\color{red}m\color{black}) = o(\color{red}m\color{black}^{log_{\color{blue}b}^{\color{green}a\color{black}}})

Alors il est possible de factoriser c(m) de cette façon :

c(\color{red}m\color{black}) = o(\color{red}m\color{black}^{log_{\color{blue}b}^{\color{green}a\color{black}}} \times log(\color{red}m\color{black}))

#Partie 3

Si KaTeX:f croit rapidement : KaTeX:\color{red}m\color{black}^{log_{\color{blue}b}^{\color{green}a\color{black}}} \text{est négligeable par rapport à}\\f(\color{red}m\color{black})

Alors il est possible de factoriser c(m) de cette façon :

c(\color{red}m\color{black}) = o(f(\color{red}m\color{black}))

#Graphes

#Composantes connexes

On peut partitionner des sommets en classe d'équivalence si il existe des relations d'équivalences entre ses membres.

Dans un graphe non-orienté, si il est possible d'aller d'un élément à un autre, alors il y a une relation d'équivalence entre ses membres

eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1ba3Paulx1MDAxNv3eX5HJ/dr6aEvaepxvISknOTdpS2nTtGc6XHUwMDE5glxyuDGYgkNcYmf63+82SbDxIzxKWtLbzLRcdTAwMDOWbLaktbT2w/r32c7ObnTT93b/3Nn1xs1G4LuDxvXu8/j6yFx1MDAxYlxm/bBHTXz6fVx1MDAxOF5ccprTnp0o6lx1MDAwZv/844/kXHUwMDBlp1x1MDAxOXZv7/JcdTAwMDKv6/WiIfX7h77v7Pw7/Z9afDe+t3pwM/nUXHUwMDFlve9ccr5cdTAwMGXFaaXdXHUwMDFi61x1MDAxN++nt047zYxcdFx1MDAwMr8/9JKGMV3VXHUwMDAyXHUwMDFkY5hcdTAwMDDGjZWIZtZ6Q63AuWNRXG4uQCiuNMNZ87XvRlx1MDAxZOqC1tGGnsBBay2kSXp0PL/difJdLMy6NHrtILaNza5cZqNBeOnth0E4iG3+XHUwMDBmb1lPysTmi0bzsj1cYq96btLngrf4xUXSp+VcdTAwMDdBPbqZPpmmmKZzN/P8XHUwMDBmd8bzzPWyu+hcdTAwMDfbnZ43XHUwMDFjztlcdTAwMWH2XHUwMDFiTT+azlx1MDAxM0uuxtb1j9zpan1OP6Hn3j3hfvmSteF3V74l9nhevLaAXHUwMDA2JFqEZF1cdTAwMTJcZimbvfgq7E3hJJlAbVx1MDAwNEvG51x1MDAwZlx1MDAwZlxiRtH0oa1GMPSSXHUwMDE5jS17mYVYXHUwMDFhZnMoirxxNJuYXHUwMDE0XGI7J/XBmah1Tz65n8K3vC7Ox/7N7qzft7tPyYxcXPXdxq09oIxCzlx1MDAxNUej1Kw98HuX1Ni7XG6C5FrYvEyG8Cw1ZVx1MDAxOUpcdTAwMTRbk6PE3GBu+aCYw7RUKDmA0Fx1MDAxMuf5IMHhwMAyaVFcdTAwMTk0PMdcdTAwMDdcdTAwMDBcdTAwMDe4YFJcdTAwMTldQFx1MDAwNS42jH1rPdviT1x1MDAwN/tzy3lcdTAwMGZyhqBpf0FZXHUwMDAwcizDOCBcdTAwMDKTnJZjXHKQz5lRhESW2lx0XHUwMDE3IzFcdTAwMDFWXGYomkNIrUjYi+r+ZEpzNne12uj6wc3cUsT371x1MDAwNX47XHUwMDFl+W6TjPVcdTAwMDa76Vx0iHySh1mHru+6gZdcdTAwMDbI0CNjp7OTmN+kn2rQ1cHRMmpcdTAwMTFcdTAwMGX8tt9rXHUwMDA07/IjiVx1MDAxZn14j2SCOVx1MDAxNlx1MDAxMrBUbpI1XHUwMDA1yK30bFWJOkxKI+RcdTAwMTKrest1bFx1MDAwYvfdlT2Gd+1rqI1O68eDYGvUIM/yeJexQjugLNda0TajRPLLt6pcdTAwMGKkutpIway1XHUwMDFhpMpcdTAwMTj2ffK4XHUwMDEx5b6jLtfkNlx1MDAxOCFcdTAwMTK0bUb+NiRKf0ej4ahzeHjYuFx1MDAwMN9t7VxyXHUwMDA2fYh+gihcdTAwMTXrTWqTg1I+cIFWXGJYnlx1MDAwZcVj3m46KHCEXCJcdTAwMDVcdTAwMDDyNZnJsEEy0lxcoWmzp5mwLCWhm1x1MDAxMMyVdftetCxcblx1MDAwNshgbfXLYfxhXHUwMDE4rqlIK8tPPEup+fk+Rcpoz4KtOqs9/Fx1MDAwMe0pXHUwMDE2vbVcdTAwMTWJlypcdTAwMTKSO2jBpLa4RVxmvPz79atu9fBDZSzF5GtcdTAwMTPDXHUwMDBmXbXlgkSbO4WBXCJcdTAwMGVcdTAwMTlQgGLJfjRcdTAwMDVcYqIjjVx1MDAwMqWtosDCSpMxbJtcdTAwMDTJoLCSJ1v2Vlx0Ujc4rdaG8ua0hpL1dL8zrlx1MDAxY/21hYKkeFx1MDAxOVx1MDAxZLjShkBg1NJ0KFx1MDAxZfN204FwxrRcdTAwMDEtQVx1MDAxM/+NnaeDXHUwMDE2jpacYmzBubUma9fPXHUwMDExJCskXHUwMDE5o+UqyH8qeiRcdTAwMWVJj1x1MDAxNuzUWT1cdTAwMTI/TI94uVx1MDAxZWlLW7RcdTAwMTVqmdzOLVx1MDAwMYNcdTAwMTf7Nfbf/sVVpVx0XHUwMDEzX1x1MDAxYf160m1vN1x1MDAwMcnRo1x1MDAwMIlzoVx1MDAxNcVKmFx1MDAwMvWtXHUwMDFlSdIjS8ywcVx1MDAwMFwizFx1MDAxNutcdTAwMTFDXG7nWDqxulWCdP3hMtw7v+n/bbxO7z2+nLSO+6MtXHUwMDE0JFDliSDBjeTkpC2TXGJ6aNTbzVxiJVx1MDAxY4FcblxyKEClhZhnhOYkSUh/3CjNeGq2fqomMUbyydivqEnykTRpwW6d1SS5XHUwMDE5TbrlxcV5XHUwMDFkvDfXtfNWZ3IyOIWP5v3lm3zafPqoeYfJoqOUXHUwMDA1iqOUXHUwMDA2y+ZcdTAwMWQmQHBcZq2QlGDiKMPmgUVBPjKhXGZcdTAwMDJoRZs+z8PrIYb8Llx1MDAxYt3Zc1820opZW5hQL3ftgdxcbkOKK1x1MDAxZSWjvppIzC73Qz8rcMmnnWRap19mnz8/L+xdXHUwMDBls8ztOdlcdTAwMGJcdTAwMWHDaD/sdv2IxvUmtilr/zBqXGaiit9z/V472+b13JKW6V17g0F43fFcdTAwMWFuwX3Ztlx1MDAwN9hbM++6er9x/Pov+9X1+Z6r3p5cdTAwMWUsw16rtMOUoMhOXHUwMDEzJEWWvSbWXHUwMDE2XHUwMDAxcWZAMlx1MDAwNjZZx3v6JoCZsVUzh0InZjhB0VLEuOnC16/MXpJMQT4lzzGVXHUwMDFhZa5cdTAwMTKcpIq1QIlmKT/oSdJ3rndcdTAwMGVgT5y92NJfXoaXR5PJSauOe/XeS8srS2mvko7WJn5HQ3LGtc6wVzhaWMVQIONWY/5cdTAwMTWOXCL2glx1MDAxM1x1MDAxN8FcdTAwMTVXsXdccik5/s3eRexcdTAwMDVuQdK/5Pkp9pZcdTAwMTd6pFKaYky5zjtcdTAwMWJPkL1ZgD1x9lpcdTAwMTV8rH+pQVx1MDAwYjzXXHUwMDFlV315XHUwMDEy9XE5z1k6SnMleFxc+rI4X/ziRjuCtnWCXHUwMDEzRTfCJPBJPGfuSKuURHK7uTKsIDD77Tnfg2sxey3FKMpKXfguSrn2ktcktbX6l9Xecpxlbn9i9F2mOIiqbN1cdTAwMTG1lJyvUFx1MDAxY1x1MDAxY3984Vx1MDAxZZ+ZcGz3L19cdTAwMWZ92VNePVx1MDAxOG9cdTAwMGKVilNPXHUwMDAwzDiohJHCKIpcdTAwMDAyuSdcbqVcdTAwMWOpKajiVlx1MDAxMD5AlNdDWNOgtevlnjaRjdXGgrXcJuTeqmTsydtJ7e3Ev97vXsq9l61IX3/ZX7E6SC5eatiPlIy15bnY2Fx1MDAwZVx1MDAwM6u8r1I86C0nhKCQXHUwMDE4XHJcdTAwMTjyu9HyzFx1MDAwYitcdTAwMDJcdTAwMWTNLcbutmLpWvom6bByKpabOFx1MDAwMljpTa31U7Fk13qatVYqNu1obTJcdTAwMTW7YK/OpmJTZjx2eVCVKlx1MDAxMjDyXHUwMDE0NYhcdTAwMTWqIa/G1Vx1MDAwMz+sVZuVoXvDmmf67Ue25dVcdTAwMTAgTXJcdTAwMTDJXHKJS6Foc1x1MDAwNULmMIZcdTAwMTi/YCksXG69vZJEekRcdTAwMGUn03ZLXHUwMDBihIdnR8PzU9WvXHUwMDA2vIWTq2tePYz8LdQkzkpPQ8RZS1xyXFwvdVx1MDAxY+KhUW85JYQkUVx1MDAwMpCkSVx1MDAwNiH1XHUwMDA29ZRcdTAwMTLKOHGwbZFkg1xiUV4g/KGqJKVWP6Y6yJT9gZKkXHUwMDFlSZJcdTAwMTbs1VlJUpuVpPn0RcohzOW6klNcdTAwMWGCodTpXHUwMDAzTIu454VYOVx1MDAxYb/p2lF7WHFcdTAwMGZY78ras63nnnEkXHUwMDFhLqVFbvT865OgiXporEJApjSY8jeYv4d7K1x1MDAxNWHu1Yfiea20ePzXUzYpXHUwMDEwqelbJ3GwZEJildTCrO2n1jtcbrl7S6pcdTAwMDFUR58uLq+arNpcdTAwMWLBOTtsXpxe5fOT+Vx1MDAwM3FcdTAwMDakYzXF+Fx1MDAwNiVcdTAwMDM2fz5UIHeAtnCK94wkpytcdTAwMTVY36PSXHUwMDE4x0qMq4dcdTAwMGbqwf9nYrLoNFx1MDAxY4m0RGVFbkulNlnq45C8XHUwMDExkyVb5rXcXHUwMDE1849apoOJNVx1MDAwZcP9XHUwMDAzz2l+d8TzXHUwMDFk+Tm1No93Li5cbvtpnCw+XHUwMDE0NzearIZcdTAwMTabv9xhuFvynZ+1otbB18rI1qrvz4TbXHUwMDFmnZx3lyFcdTAwMWbEXHUwMDA3sDl5r1YzXHUwMDAyhZTzmbdcdTAwMWP9cuyT0pGax3WW76VcdTAwMWbQJtDkvz79wJK3XCIoWisqXHUwMDAw8PKwW1xibilcdTAwMWO1y/g5q1x1MDAxMlClT5+sQ0B8vqOeJPUyhpeQ7tmdgu42+v16RLM3c1J2R753XSmAamv6XHUwMDE3x7FTysZQ9aa+zbdn3/5cdTAwMDdssFx1MDAwN8MifQ== 123456[1, 2, 3, 4][5, 6]

Dans un graphe orienté, si il est possible d'aller d'un élément à un autre et de revenir sur l'élément de départ, alors il y a une relation d'équivalence entre ses membres. Ils sont même fortement connexe

eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXFtT20hcdTAwMTN9z6+g+F5BOz2Xnpl9XHUwMDAzXHUwMDEyXHUwMDAybEhCuIRkK+UytmxcdTAwMTR8iy2M8Vb++9djwJJ1MZaxicmuUpWydXNrps853T0t/nm1trZcdTAwMWXedvz1P9fW/UGl3Fxiqt3yzfqG29/3u72g3aJDfPS9177uVkZnXoZhp/fnXHUwMDFmf0RXeJV28+4qv+E3/VbYo/P+pu9ra/+M/qcjQdVdu/v6dvi13j9tdX/0xNl2vTXQm6ejS0cnjY1pNIJOz49cdTAwMGVcZmivXHUwMDE2yjOGXHRg3FiplFx1MDAxOVx1MDAxZr2lo8C5Z5VcdTAwMTRcXIBAjpqp8eGboFx1MDAxYV7SKcp62tBcdTAwMWQ4aK2FNNFcdTAwMTmXflC/XGbTp1hcdTAwMTifUm7VXHUwMDFizjY23tNcdTAwMGK77St/p91od53N/6sxU2EssvmiXFy5qnfb161q7JyaX7E2OqdcdTAwMTY0XHUwMDFhx+Ht6M40xDSc64n7f743nif2511FP1i/bPm93oSt7U65XHUwMDEyhKNxYtFeZ11nvzqarW/xO7Sq93d4mL5obvj9np+RPb7v5lx1MDAxNpRcdTAwMDGprIJoXlwiXHUwMDFm0lwiufN9uzVyJ2BcdTAwMWEtXHUwMDA3a6JcdTAwMDdcZnqvyY/C0V1r5UbPj4bUmfYm6WNxP5two9BcdTAwMWaE45GJeeHl4XH3XFxcdTAwMWM1XHUwMDBmv1a/tj/xY1FcdTAwMWFcdTAwMDS36+Pzfm5k3/bu4p3tSnjVOeG7xydl+/7NRVx1MDAwMypcdTAwMDebk7/y8Pvlbrd9M+t9T5ubl8N3Q9R7x/tcdTAwMDffdbNVxs7n2e57/ymawutOtXw3foBcdTAwMDZcdTAwMTVcdTAwMTfMcot6fLxcdTAwMTG0ruhg67rRiPa1K1fRkL+KXHUwMDE5nMBw9uilMDwx+HdcdTAwMDBG5jEtUUlcdTAwMGUgtFSTXHUwMDAwluBxYGCZtFxujYo5xFx1MDAwM4BcdTAwMDE8oGeRaHRcdTAwMDZ2uVgwWK31bY2/XHUwMDFjsE5M51x1MDAwMyqZXHUwMDAyTYSoZFx1MDAwNioxXHUwMDFmlFZcdTAwMTLLSsXmXHUwMDAw5YRcdTAwMTlcdTAwMTmeSFx1MDAwZoVcdTAwMDU8MXIs51A0hlx1MDAxMJuRdis8XHUwMDBlhiNeYlx1MDAxM3t3y82gcTsxXHUwMDE17vqtRlB3T75eIWP97np8XHUwMDAwwoD0bHxCM6hWXHUwMDFiftxBej5cdTAwMTk7XHUwMDFhnYjhKvRTZdrb3Z9F3trdoFx1MDAxZbTKjZP0k7hb7z14Mrm5ylx1MDAwNGCuPkZzXG6gc2dVWFx0UquYL+TP6lx1MDAxZNZVXVRPru07OKnfwFH/7Phdt3GxKohIo9yxjFx1MDAxNdpcdTAwMDOSXHUwMDE0rZFoXHUwMDA2RfTLd2FcdTAwMDJQmKCNJEe0VoPEhGFcdTAwMTH8ec36Uk6niFx1MDAwYl7jXHUwMDE3sVx1MDAwMVlIqHFcdTAwMGZdrinOMUJE3rZcdTAwMTi9XpCIXHUwMDFlhP1e/3Jvb698XHUwMDAxQbW21e12IPzVXCJ6cT7Yvzl/2/qwib2j4aBXXHUwMDFhbuvhXHUwMDAy7vuxutMpsaNcdTAwMWbnplItXX2/YkZcZm5cdTAwMTcmzkiKJ+JUMI84Z+tuRFxmXG5yeYFcdTAwMGJlhYDZaSF77lebXHUwMDE2XHUwMDEwPIGkhEBJXHUwMDAyM1x0VpCMYlx1MDAwZqGBUVx1MDAwNCssi4VcdTAwMTLzsEIycChcdTAwMWO/PIg3uVx1MDAwNVx1MDAwM8Vg7igghfV8N+RcdTAwMTQksFhSVUCZXHUwMDBiy7BcdTAwMWKl2Pg8TZlcdTAwMTNcdTAwMWH8iGQlNZhP0eBs8Z9bmXmuMiNj0onBLDnQXHUwMDFkXHUwMDAyr1x1MDAwZT68b+7ufd5cdTAwMWVIMfxRUe3PTVxccWEmkaP8XVx1MDAxOMG4XHUwMDEygCzio5GDKOVJg4DaolDaSpMwbJWE2ShcbqV4XHUwMDE0OqyUMDdcdTAwMWJnu0c9eXt2pCRr6c7lYHv/7TNkoVPva3j9R//iy+bbITv46+SwvXV9+zr4T5hHWVx1MDAxOM+jXHUwMDA1jtpcdTAwMTBcdTAwMThcZs5MXHUwMDBi2XO/2rRAeGPagJagXHUwMDE1fbCTtKCFpyVnQlx0zm28SvQrhdlcbknGaFmEXHUwMDAxXoouiyXp8iOKldRl8Wy6zHmqYlx1MDAxOWXM2jDJdCxcdTAwMDd7XGaBjc2dI/ZX5+J6u1x1MDAwMsNAXHUwMDFh/WHYrK82XHUwMDAyKeKljJlzoZGSZ1x1MDAxNfPqO2GWJMyWoGFdRirMXG5cdTAwMGIzU5Tfs/jSwEop883nq/ZW6bZzYPzL1ql6M6y96/R/tYI+IWWeQUGVjZdYlqSggCpcdTAwMWbB3EiupZ2lkjltllZcdTAwMWLBKDyhUFx1MDAxOUBQqIWYRLDmpKGKNm5QM1x1MDAxZVx1MDAxYq1fKqKMkd7Hi8G/j4jKJYnoI+qSXHUwMDE0UflsXCJKbpdcdTAwMDdBpbSUpC6za+jgy2b13blpXHUwMDBm7M7Vh/3vW+hcdTAwMWY3XHUwMDA2q41AXHUwMDAwZjyFwkhhUDKWgCCA9qRcdTAwMTZouFx1MDAxNYhcdTAwMTJEflx1MDAxY8sqRsWXiItAcFx1MDAxMVwiSlx1MDAxMThYy21UXHJcXClccj38NDz6NFxmbnaaV3LrTS3UN9933lx1MDAxNtEkjoxid4hcdTAwMDNjXHUwMDE5mmTzJcnZYaBIvTX7oVdcdTAwMWNcdTAwMTCCVIdcdTAwMTTJaE1cdTAwMGXNXHUwMDEzXHUwMDA1V6E8za1SNFx1MDAxN8jitaBFwqGwXCJxo4RihVZcXOZXJLJcdTAwMGLnWlxinUuR1JJcdTAwMTTpXHUwMDExrk4qkno2ReKYv1x1MDAxMIrAtCbPnFx1MDAxZIHvXHUwMDA3u6+D9tFuZbtXvWWVc/3pXHUwMDBiW/GgXHUwMDEwSJM8pdAwQaKjbCqvY1x1MDAxZUVgyi2UXG6rhF5dSVwiPVx1MDAwMoNM21x1MDAxNc3r9s73e6Uz7Ow2eE1ccq9v+O5eXHUwMDE4zJp/neOX49M3YeWwvFlcdTAwMWF+P9g6+Yq9/YXlX0S+WCTsnUvrOLO5UKNYSFx1MDAwM6esY2aoZY/mikNNSFx1MDAxMjtcdTAwMDBJWmdcdTAwMTR9m4RcdTAwMWFcdTAwMWGPI1x1MDAxMMpIjlxiaPn517OqnZRcdTAwMWGfJ/liaJ9R6nBJUveIXHUwMDA2JKVcdTAwMGVcdTAwMTcjdXeg6MJu/+vF1XWF7bb6UGJ7lYuz61ma7lxmR49cdTAwMTlXsKa4XHUwMDE32WTTrFDcXHUwMDAzclx1MDAwM4pFjSRBiFx1MDAwNf1cdTAwMGZehehpup7ymif33M1TXHUwMDFlfIk9d1x1MDAwNHWp0FxuXHUwMDE297SHLozcxVx1MDAxZVx1MDAwMFx1MDAwMqSxSi++51x1MDAwZZjSSsW9sWjP3d98Y01srMlvz9J7XHUwMDE3tjvFXHUwMDFh7yZcdTAwMWUlicNcZttn67a7Q17pvFx1MDAxNtZe/9ju26Pd03NR7fRcdTAwMGZLzVmQXHUwMDA3riWdk/xZzchcdTAwMWaknCxcdKSwl4KelJ7UXHUwMDFjXHUwMDE18qdcIlx1MDAwZqyGXG7//ZFHXHUwMDEw0kpQXHUwMDE4mdXtyvPbXYWgNNQwO0uJqlx1MDAxMPQoXHRBI+aqO46hpzbW8EXiLmF4XHUwMDEx0E3vXHUwMDBmTFx1MDAwNMRcdTAwMTOo01x1MDAxNj1EpSxBitJcckzU4ZT0jKS5kdxqXG7Eolx1MDAxNHFcdTAwMWNFSUqamECK4kCjezchjT3wXFyBXGZcdNpcXFmYqOQspvP8pWGxyGtcIlx1MDAwNihcdTAwMWFcdTAwMTHaZkE0v0dRMaMoSVxcSkM6xTdFmjzGuzvtIJk2Rp/WomFcdTAwMWR9XHUwMDE5f/62kXl2vt+5bTPtctFccl8lbrzeKPfCnXazXHUwMDE5hPSkXHUwMDFmnZUpvlxmy91wO2hVg1Z9cv7u3+CapZ99RDuV65FcdTAwMGJRjElGUdSjudBcdTAwMDa4iZm/Xi93RqhhlMMzXG5HQDPg9p5cdTAwMDDiPuK3qo9cdTAwMWI1vcEvZtQmWVx1MDAwNZZyMlx1MDAwNvRPSVx1MDAxYddcZqvSjurGZssxy6VfTrFcdTAwMWOZXHUwMDE4P1x1MDAxNs/Js6lsekfVVCpD5ZGUafeyjFx1MDAxMTzZyW6Ep1x1MDAwNbmEK1lcdTAwMTKbReo2prJ8mlx1MDAxYVNcdTAwMTlqT1N6Jrl0+mdjUeJ/TDZcdTAwMDOTMWE4S8VcdTAwMTXTg1xyzSUzhuEsXHUwMDE1kVx1MDAxN0llXHUwMDE5ZFx1MDAxNb8+5XIrxWSONFx1MDAwNCN9XCLqsMYg51x1MDAwMLHT8khjJuaa3lx1MDAwMpUwXHUwMDAyXHUwMDExXHT2d9BcdTAwMDZcdTAwMTPBe2yE9Fx1MDAxOKPEXHUwMDBlXHUwMDE4XHKhoXFcXDqTTe9AmVx1MDAxZZQpXG7KyFx1MDAxNWjONViWqERcdTAwMWLlXHTDSDyY4lKizaAyyT1pXHUwMDExpaKrOZpYy9aYyqZcdTAwMTXp/lxypYhcdTAwMDLURckoZtKWzH9Pl4Jp8sR4d9jCaEtaw389beX7WOLy5bHUzFx1MDAwNFx1MDAxMXuyp1HS9IaSJC/GN8JpVohcdTAwMDdcXElcdTAwMDOgrGWWy1xmXHUwMDBmXFwsJ03vXpvGSZTwu4BcdTAwMTSU0Vx1MDAxMlx1MDAwNcdEyV5cdTAwMDGF44xLXG5mjbBcdTAwMWHSnMRI5VBcdTAwMWFGQTu3SqqMRPEp0dW/nKIosDKSQvfM4Cp/uYlZM5KYhVdy7lpcdTAwMTmLvEK/pOAq1+1GR39JcFWIRECDXCJkaSMpumJcdTAwMTbSKZmgwEYq0lx1MDAxYo6aXCJcdTAwMDeKl+fjtplcdTAwMTNFZ5VCI5U2ritDXHUwMDE5wXTKqsmglst09rpgapv+astUapPSlZZd/KjJc3miXHUwMDA2psFzrCalc2jFMqIt1/KtpGSu9GxARaNcdTAwMTFRm+VcdTAwMWVqYk3hOsaNLVRcdTAwMDL7l1NcdTAwMWJwrcFcdTAwMTUgM0tg+Vx1MDAwYkR89C6oVkvgtqIvOi0rccx1PLelXFzuObitSLVcdLTmoDhRiFu3YTJcdTAwMTZAPl/iSPCmeNp1IbhVpdhcdTAwMWZ7XHUwMDE4XHUwMDFiQcMomeBcdTAwMTT3XGLUlEJcbrNsKpve4zKNylx1MDAwMIQhlzCUXHUwMDE3WkUmT740XG5cdTAwMWFJ7kjsXHUwMDE0s5SpXHUwMDFilV6/npRLjNedx1xc5lxiUbp1NnSvXHUwMDBiULJdgMt+x6W1QkUwUmjh3pnP4rIpPbBcdTAwMTSlXGKDM72WUZDLjFIrkE3m+53bUlx1MDAxZbdIKkti9XF+md7Zklxm4Ig4XGZYMJTqXHUwMDEx2Zh0ZYpSJyBaXHUwMDExnOKLUT44XHUwMDAzwSTBX5hjtoLhp+5Wn5VKW1x1MDAxZuttXHUwMDFi7pTqxyrNMVx1MDAxOVx1MDAxZDJcdTAwMTI9slVcdTAwMDNDXG5MXHUwMDAxJ4tTXHUwMDAy0KNj0imvxoh+XHUwMDFl+MWt8Vx1MDAwYnST+ORV+t/xXHUwMDBmyGX2x4CgnDozs0v3zIxcdTAwMTdcdTAwMDBcclx1MDAxM2Li1b6FdceAtbHm13mW6OFFrs/D44vzr+6JaL3c6Vx1MDAxY4c0bmNcdTAwMTJZ71x1MDAwN/7NdqaHus0hdYRT56H+SFR+vvr5f33q5bYifQ== 123456[2, 3, 4][5, 6][1]

#Arbres et forêts

#Définitions

Pattern Description
Arbre Graphe non orienté, connexe et sans cycle
Arbre enraciné Arbre avec un sommet distingué (racine)
Forêt Graphe non orienté où chaque composante connexe est un arbre

#Matrices d'adjacences

Pour montrer les connexions entre les différents membres d'un graphe, on utilise une matrice d'adjacence :

La matrice d'adjacence suit le sens d'un graphe orienté

De la même manière, si on utilise des distances, on les ajoute dans la matrice :

#Parcours dans un graphe

#Parcours en largeur

On utilise une File

Ici :

  • v est notre graphe
  • s est notre racine
  • Vert utilisé pour les sommets traités
  • Orange pour les sommets ajoutés dans la file
  • Rouge pour les sommets non visités
Parcours_Largeur:
  Pour chaque sommet u appartenant à v
    Marquer u en rouge
  F = File vide
  Marquer s en orange
  Ajouter s à F
  TantQue F n'est pas vide
    u = défiler(F)
    Marquer u en vert
    Pour tout voisin v de u
      Si couleur(v) == rouge
        Ajouter v à F
        Marquer v en orange

#Parcours en profondeur

On utilise une pile

Ici :

  • v est notre graphe
  • s est notre racine
  • Vert utilisé pour les sommets traités
  • Orange pour les sommets ajoutés dans la pile
  • Rouge pour les sommets non visités
Parcours_profondeur
  Pour chaque sommet u appartenant à v
    Marquer u en rrouge
  P = Pile vide
  Marquer s en orange
  Ajouter s à P
  TantQue P n'est pas vide
    Si Sommet(P) a un voisin rouge v
      ajouter v à P
      Mettre v à orange
    Sinon
      u = dépiler P
      Mettre u à vert