Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| tc_info:2020_td-tp_abr [2020/08/06 19:53] – pprea | tc_info:2020_td-tp_abr [2020/08/09 14:18] (Version actuelle) – pprea | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== TD-TP " | ||
| + | |||
| + | Ce " | ||
| + | |||
| + | Il n'est pas nécessaire de faire tout le TD avant d' | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ===== Partie TD ===== | ||
| + | |||
| + | < | ||
| + | Un **Arbre Binaire** est un arbre tel que chaque sommet a au plus deux fils. Les arbres binaires sont très utilisés car ils permettent de modéliser un grand nombre de situations ; de plus, les arbres non binaires sont plus complexes à implémenter (//i.e.// programmer effectivement). | ||
| + | </ | ||
| + | |||
| + | === 1. Caractéristiques d'un arbre binaire === | ||
| + | Donnez des algorithmes (avec leur complexité) qui calculent: | ||
| + | * Le nombre de sommets d'un arbre, | ||
| + | * Le nombre de feuilles d'un arbre, | ||
| + | * La hauteur d'un arbre. | ||
| + | [[tc_info: | ||
| + | |||
| + | < | ||
| + | Un **Arbre (Binaire) de Recherche** est un arbre binaire dont les sommets sont indexés par un ensemble ordonné (//e.g.// des nombres) & tel que, pour chaque sommet $s$, les descendants gauches de $s$ aient une étiquette plus petite que celle de $s$ & les descendants droits une étiquette plus grande. | ||
| + | </ | ||
| + | |||
| + | === 2. Dessin === | ||
| + | Dessinez un arbre de recherche. \\ [[tc_info: | ||
| + | |||
| + | |||
| + | === 3. Parcours === | ||
| + | Que donnent les trois parcours classiques (En-ordre, Pré-Ordre, Post-Ordre) sur un arbre de recherche ?\\ [[tc_info: | ||
| + | |||
| + | === 4. Fonctions de base === | ||
| + | Donnez des algorithmes (avec leurs complexités) qui : | ||
| + | * Détermine si une valeur $x$ est dans un arbre de recherche | ||
| + | * Insère une valeur $x$ dans un arbre de recherche. [[tc_info: | ||
| + | * Supprime une valeur $x$ d'un arbre de recherche. [[tc_info: | ||
| + | |||
| + | === 5. Création === | ||
| + | Donnez un algorithme qui, à partir d'une liste de nombres, crée un arbre de recherche ([[tc_info: | ||
| + | |||
| + | |||
| + | < | ||
| + | Pour rechercher une valeur dans un tableau //trié//, on utilise généralement la **recherche dichotomique**, | ||
| + | </ | ||
| + | |||
| + | === 6. Recherche dichotomique 1 === | ||
| + | Quel est le lien entre recherche dichotomique & arbres de recherche ? | ||
| + | |||
| + | === 7. Recherche dichotomique 2 === | ||
| + | Écrivez la recherche dichotomique (de préférence de manière itérative). Attention, la recherche dichotomique est un algorithme très simple mais sur lequel on fait beaucoup d' | ||
| + | |||
| + | === 8. Choix 1 === | ||
| + | Il existe deux versions de la recherche dichotomique : soit on arrête l' | ||
| + | |||
| + | === 9. Choix 2 === | ||
| + | Avantages & inconvénients des arbres de recherche par rapport aux tableaux triés ? [[tc_info: | ||
| + | |||
| + | |||
| + | ===== Partie TP ===== | ||
| + | |||
| + | Un arbre binaire est ici défini comme suit : | ||
| + | * un arbre vide correspond à la valeur '' | ||
| + | * La racine d'un arbre non vide est une liste constituée de 3 éléments | ||
| + | * la valeur | ||
| + | * la racine du sous-arbre gauche | ||
| + | * la racine du sous-arbre droit | ||
| + | |||
| + | Un arbre binaire de recherche respecte de plus la contrainte suivante: | ||
| + | * pour tout nœud de l' | ||
| + | * les valeurs situées dans le sous-arbre gauche sont plus petites que la valeur du nœud | ||
| + | * les valeurs situées dans le sous-arbre droit sont plus grandes que la valeur du nœud | ||
| + | |||
| + | Nous implémentons dans ce TP un arbre binaire de recherche. | ||
| + | |||
| + | Ouvrez l' | ||
| + | |||
| + | Dans ce projet, créez un fichier python '' | ||
| + | |||
| + | === 1. Pour commencer === | ||
| + | |||
| + | L' | ||
| + | |||
| + | <code python> | ||
| + | INDEX = 0 | ||
| + | GAUCHE = 1 | ||
| + | DROIT = 2 | ||
| + | </ | ||
| + | |||
| + | * Créez une fonction '' | ||
| + | * Testez cette fonction dans le fichier de test (vérifiez que l' | ||
| + | * Créez une fonction '' | ||
| + | * Testez cette fonction dans le fichier de test (vérifiez que la valeur contenue dans la feuille est correcte, et que les fils gauche et droit sont nuls) | ||
| + | |||
| + | === 2. Insérer des valeurs === | ||
| + | |||
| + | L' | ||
| + | |||
| + | < | ||
| + | algo : insérer_rec | ||
| + | données : | ||
| + | * racine | ||
| + | * val | ||
| + | début: | ||
| + | si racine est nul: | ||
| + | retourner feuille(val) | ||
| + | sinon: | ||
| + | si val < racine[INDEX]: | ||
| + | racine[GAUCHE] <-- insérer_rec(racine[GAUCHE], | ||
| + | sinon: | ||
| + | racine[DROIT] <-- insérer_rec(racine[DROIT], | ||
| + | retourner racine | ||
| + | </ | ||
| + | |||
| + | * Ajoutez la fonction '' | ||
| + | * Testez-la à l'aide du fichier de test, en particulier: | ||
| + | * vérifier que l' | ||
| + | * vérifiez qu' | ||
| + | * affichez l' | ||
| + | |||
| + | === 3. Affichage en ordre === | ||
| + | Écrivez et testez une fonction qui affiche les valeurs de l' | ||
| + | |||
| + | === 4. Recherche === | ||
| + | * Écrivez une fonction de recherche récursive '' | ||
| + | * Testez cette fonction dans le fichier de tests | ||
| + | |||
| + | === 5. Suppression === | ||
| + | * Ecrivez et testez une fonction '' | ||
| + | * Aidez-vous de la fonction '' | ||
| + | * Testez cette fonction dans le fichier de tests | ||
| + | |||
| + | |||
| + | === 6. Affichage en arbre === | ||
| + | |||
| + | Pour bien comprendre l' | ||
| + | < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |23-| | ||
| + | | ||
| + | | ||
| + | | ||
| + | 10-| | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |3--| | ||
| + | | ||
| + | | ||
| + | </ | ||