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: E=Set([1,43,54,’bonjour’,’au revoir’,pi]}
sage: E
sage: 43 in E ; 44 in E
sage: n=E.cardinality(); k=2
sage: P=E.subsets(k); P.cardinality()==binomial(n,k)
sage: F=Set([3,1,’au revoir’])
sage: H=E.union(F) ; print H
sage: H=E.intersection(F)
sage: parent(E)
sage: L,T=list(E),tuple(E)
sage: 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) #DiGgraph pour "directed graph"
sage: G.show()
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 à nest
la liste des entiers de 1à50 que ndivise.
2. 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àmsi et seulement si ndivise m
3 Arbres binaires
Un arbre binaire est défini récursivement de la façon suivante : c’est une liste Ttelle que soit T=[] soit
T=[a,T1,T2], où aest la racine (ou l’étiquette à la racine) de l’arbre et T1 et T2 sont des arbres binaires.
Exercice 2 :
Fonctions élémentaires.
1. 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.
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 msi et seulement si nest le fils gauche de mou
mest 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
4. Ecrire une fonction repr() qui à un arbre binaire associe une représentation graphique du graphe
orienté ci-dessus. On pourra utiliser les options
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.
2. Ecrire une fonction est_ABR sous Sage qui à une liste renvoie le booléen True si cette liste est un arbre
binaire, False sinon.
Exercice 5 :
Production d’un arbre binaire de recherche à partir d’une liste d’entiers.
1. Ecrire une procédure insere_ABR qui à un arbre binaire de recherche Aet un nombre réel rrenvoie
l’arbre binaire de recherche dans lequel a été inséré le noeud r.
On peut écrire cet algorithme récursivement : si rest inférieur à la racine de A, alors on insère rdans le
sous-arbre de gauche, sinon on l’insère dans le sous-arbre de droite de A.
2. Majorer le coût de cet algorithme en fonction de la profondeur de l’arbre A(répondre par un raison-
nement, et non une expérience).
2
3. Ecrire un algorithme liste_ABR qui à une liste d’entiers Lassocie un arbre binaire de recherche dont
les noeuds sont étiquetés par ces entiers.
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
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !