TNSI : Introduction aux Arbres⚓︎
Joke
⚓︎
Vous pensez que ça n'existe pas?
j'ai trouvé un vrai Arbre" !
Exemples d'Utilisation des Arbres⚓︎
Arbre des Expressions Syntaxiques⚓︎
Les \(4\) opérations \(+, −, ×\) et \(\div\) sont des opérations binaires. Une expression ne comportant que ces symboles peut donc être représentée sous forme d'un arbre (binaire) comportant deux sortes de noeuds : les noeuds internes sont des opérations, les feuillles sont des nombres.
Dans un tel arbre, l'arrangement des noeuds joue le rôle des parenthèses auxquelles nous sommes habitués. Ici, l'arbre peut représenter l'opération \((3\times 5) - (2+4)\)
Arbre de Jeu⚓︎
Arbre de Jeu
Un
Exemple 1 : Jeu de Nim⚓︎
L'arbre ci-dessus modélise un jeu de Nim, dont on rappelle les Règles du Jeu :
On dispose de \(5\) allumettes. Chacun son tour, chaque joueur peut en prendre \(1\) ou \(2\). Celui qui prend la dernière allumette gagne.
L'état du jeu est totalement défini par le nombre d'allumettes à jouer restantes et le nom du prochain joueur à jouer.
- Les (valeurs des) noeuds indiquent le nombre d'allumettes à jouer restantes,
- la couleur de l'arête indique quel joueur doit jouer (Rouge ou Bleu). Le Rouge commence
Cet arbre montre que les deux joueurs ont chacun \(4\) possiblités de gagner, mais que le joueur Rouge a une stratégie gagnante car, s'il choisit bien ses coups, il est sûr de gagner sans que le joueur Bleu ne pourra empêcher.
Exemple 2: Jeu du Morpion (Algorithme MiniMax)⚓︎
Dans un jeu où on ne retrouve pas deux fois la même position dans la même partie, le graphe des positions est sans cycle, donc c'est un arbre.
Dans cet exemple modélisant les positions du jeu de Morpion (Algorithme MiniMax) :
On commence par étiqueter les feuilles, qui modélisent des parties finies, en convenant de coder le résultat final (Gain ou Utilité) :
+1
pour une victoire de X, et−1
pour une défaite de X,0
pour un nul (égalité)
À l'étage supérieur, on étiquette chaque noeud parent
p
(récursivement), en raisonnant comme suit :
- Si le noeud parent correspond au tour de X (ou Joueur Max), le (minimax du) noeud parent vaut le maximum des valeurs (minimax) des noeuds enfants
- Si le noeud parent correspond au tour de O (ou Joueur Min), le (minimax du) noeud parent vaut le minimum des valeurs (minimax) des noeuds enfants
- pour le jour Max (X), consiste à choisir le Max des noeuds enfants
- pour le jour Min (O), consiste à choisir le Min des noeuds enfants
On peut prouver qu'il y a match nul pour deux joueurs qui ont la meilleure stratégie.
Arbre Syntaxique de Code⚓︎
a = 2
for i in range(3):
a = a * 5
print(a)
Comme tous les langages de programmation, Python dispose d'une grammaire qui indique comment former des programmes corrects du point de vue de la syntaxe, qu'il puisse comprendre. L'interpréteur Python lit le code source puis construit l'arbre syntaxique du code. En simplifiant un peu, le code source précédent pourrait être représenté par l'arbre ci-dessus. Tous les traitements futurs du code seront faits à partir de cet arbre.
Tas⚓︎
Tas
Un
Cette structure de données est utilisée dans deux situations classiques:
- pour implémenter les Files de Priorité, car un tas permet de retirer efficacement l'élément de priorité maximale (resp. minimale)
- pour implémenter le Tri par Tas : qui est un algorithme de tri efficace
Arbres Binaires de Recherche⚓︎
ABR - Arbres Binaires de Recherche
Un
- les clés du sous-arbre-gauche sont (toutes) inférieures ou égales à celles de la racine
- les clés du sous-arbre-droit sont (toutes) supérieures ou égales à celles de la racine
- les deux sous-arbres (Gauche et Droit) sont eux-mêmes des arbres Binaires de Recherche
Comme son nom l'indique, cette structure de données est utilisée pour rechercher efficacement un élément dans un arbre (Complexité en temps logarithmique lorsque l'arbre est dit bien équilibré)
Principal Intérêt des Arbres? (Spoiler)
⚓︎
Dans les Listes / Piles / Files, la Recherche / l'Insertion / la Suppression d'un élément est proportionnel à la taille \(n\) de la Liste / Pile / File, donc en temps linéaire
Le principal intérêt des arbres est la complexité de leurs opérations:
- Pour un arbre quelconque:
- La
Recherche d'un élément admet une complexité en temps en \(O(h)\), où \(h\) désigne la hauteur de l'arbre. - L'
Insertion d'un élément admet une complexité en temps en \(O(h)\), où \(h\) désigne la hauteur de l'arbre. - La
Suppression d'un élément admet une complexité en temps en \(O(h)\), où \(h\) désigne la hauteur de l'arbre.
Cela peut sembler déjà intéressant, mais il existe des cas dégénérés le rendant moins intéressant. Néanmoins :
- La
- Si de plus on choisit l'arbre de sorte qu'il soit bien équilibré (en un certain sens à préciser), Alors la hauteur \(h\) sera logarithmique : \(h= O(\log_2(n))\).
Par conséquent, la Recherche/Insertion/Suppression d'un élément dans un Arbre équilibré sera en temps logarithmique\(O(\log_2(n))\)