TP n˚3

publicité
Nicolas Gourmelon
Calcul Scientifique et Symbolique Avancés
11 février 2014
TP n˚3
Arbres binaires de recherche
1
Ensembles
Avec Sage, un ensemble se définit et se manipule de façon intuitive :
sage:
sage:
sage:
sage:
sage:
sage:
sage:
sage:
sage:
sage:
sage:
E=Set([1,43,54,’bonjour’,’au revoir’,pi]}
E
43 in E ; 44 in E
n=E.cardinality(); k=2
P=E.subsets(k); P.cardinality()==binomial(n,k)
F=Set([3,1,’au revoir’])
H=E.union(F) ; print H
H=E.intersection(F)
parent(E)
L,T=list(E),tuple(E)
Set(L)==Set(T)==E
Remarque importante : Il existe une classe d’objet se rapportant aux ensembles sous Python. C’est
le type ’set’. On peut définir un ensemble de ce type de la façon suivante :
E={1,2,3} ; type(E)
Un certain nombre d’attributs/de méthodes élémentaires sur les ensembles (union, intersection, etc...)
sont définies sous Sage ; la liste s’obtient en tapant E. puis T abulation.
Comme on peut le voir cette liste est assez limitée, la classe d’objets de type ’Set’ (majuscule) a donc
été créée sous Sage, comportant une bibliothèque beaucoup plus complète de méthodes.
sage: E=Set([1,2,3]) ; E
sage: type(E)
sage: E. #appuyer sur tabulation
2
Dictionnaires
Un objet spécifique à Python/Sage est le dictionnaire. Un dictionnaire est un ensemble non ordonné de
paires cléf-valeurs.
sage: CSSA={’TP’ : [’Mar 15h30-18h20’], ’Cours’ : [’Jeu 8h-9h20’]}
sage: CSSA[’TP’] ; CSSA[’Cours’]
Les cléfs sont les entrées du dictionnaire, on en obtient la liste ainsi
sage: CSSA.keys()
Les valeurs et les clés sont modifiables :
sage: CSSA[’TP’].append(’parfois le vendredi’) ; CSSA
sage: CSSA[’TD’]=[’le samedi’] ; CSSA
sage: del CSSA[’TD’] ; CSSA
Enfin, on peut représenter un dictionnaire par un graphe orienté :
sage: G=DiGraph(CSSA)
sage: G.show()
#DiGgraph pour "directed graph"
ou par un graphe non orienté (mais on perd l’information de ce qui est clé et valeur) :
sage: G=Graph(CSSA)
sage: G.show()
1
Exercice 1 :
1. Ecrire un dictionnaire dont les clés sont les entiers de 1 à 50, tel que la valeur correspondant à n est
la liste des entiers de 1 à 50 que n divise.
Représenter graphiquement le graphe orienté dont les sommets sont les entiers de 1 à 50, de sorte qu’il
y ait une arête allant de n à m si et seulement si n divise m
2.
3
Arbres binaires
Un arbre binaire est défini récursivement de la façon suivante : c’est une liste T telle que soit T=[] soit
T=[a,T1,T2], où a est la racine (ou l’étiquette à la racine) de l’arbre et T1 et T2 sont des arbres binaires.
Exercice 2 :
Fonctions élémentaires.
Ecrire une fonction est_AB sous Sage qui à une liste renvoie le booléen True si cette liste est un arbre
binaire, False sinon. Tester cette fonction.
1.
2.
Ecrire une fonction prof qui à un arbre binaire associe sa profondeur.
3.
Ecrire une fonction GrapheOr qui à un arbre binaire associe un graphe orienté de la façon suivante :
— les sommets du graphe sont les noeuds de l’arbre
— il y a une arête allant d’un noeud n à un autre m si et seulement si n est le fils gauche de m ou
m est le fils droit de n.
Remarque : la donnée de ce graphe orienté et de la racine détermine de façon unique l’arbre binaire
Ecrire une fonction repr() qui à un arbre binaire associe une représentation graphique du graphe
orienté ci-dessus. On pourra utiliser les options
4.
MonGraphe.show(layout=’tree’, tree_root=racine_de_l_arbre, tree_orientation="down")
Exercice 3 :
Parcours d’arbres binaires.
1.
Ecrire un algorithme de parcours en profondeur infixe.
2.
Ecrire un algorithme de parcours en largeur.
Exercice 4 :
Un arbre binaire est appelé arbre binaire de recherche si et seulement si l’ensemble des noeuds/étiquettes
est muni d’une relation d’ordre telle que
— si l’arbre est non-vide, alors tout noeud du sous-arbre gauche (resp. droit) est inférieur (resp.
supérieur) à la racine.
— les sous-arbres gauche et droit sont tous deux des arbres binaires de recherche.
1.
Représenter graphiquement un exemple d’arbre binaire de recherche.
Ecrire une fonction est_ABR sous Sage qui à une liste renvoie le booléen True si cette liste est un arbre
binaire, False sinon.
2.
Exercice 5 :
Production d’un arbre binaire de recherche à partir d’une liste d’entiers.
Ecrire une procédure insere_ABR qui à un arbre binaire de recherche A et un nombre réel r renvoie
l’arbre binaire de recherche dans lequel a été inséré le noeud r.
On peut écrire cet algorithme récursivement : si r est inférieur à la racine de A, alors on insère r dans le
sous-arbre de gauche, sinon on l’insère dans le sous-arbre de droite de A.
1.
2. Majorer le coût de cet algorithme en fonction de la profondeur de l’arbre A (répondre par un raisonnement, et non une expérience).
2
Ecrire un algorithme liste_ABR qui à une liste d’entiers L associe un arbre binaire de recherche dont
les noeuds sont étiquetés par ces entiers.
3.
4. En utilisant la fonction repr précédemment définie pour représenter un arbre binaire, vérifier le bon
fonctionnement de cet algorithme.
Exercice 6 :
1.
Proposer une fonction tri_ABR triant des listes en passant par des arbres binaires de recherche.
2.
Quelle est le coût maximal de cet algorithme ? Dans quels cas de figure ce maximum est-il approché ?
3
Téléchargement