Introduction à l`Algorithmique et la Programmation feuille de

publicité
Introduction à l’Algorithmique et la Programmation
feuille de TD Structures de données avancées
Exercice - 1 Consultation de listes
1- Ecrivez une fonction position(elt, liste, depart) qui renvoie l’indice i de la première occurrence
de elt dans liste telle que i ≥ depart, ou −1 si une telle occurrence n’existe pas.
2- Ecrivez une fonction sousListe(petiteListe, grandeListe) qui renvoie la réponse à la question : «
les éléments de petiteListe apparaissent-ils tous, et dans le même ordre, dans grandeListe ? » (c’est
le cas, par exemple, pour [2,4,10] et [1,2,4,5,6,8,10,12]).
3- Dans les fonctions précédentes est-il indispensable que liste, petiteListe, grandeListe soient des
listes ? Pour quel autres types données ces fonctions fonctionnent-elles telles quelles ?
Exercice - 2 Opérations globales sur les listes
Les trois opérations sur les listes décrites ci-après reviennent souvent dans les applications, c’est
pourquoi il est intéressant de les écrire une fois pour toutes, sous forme de fonctions :
1- Transformation d’une liste.
a- Ecrivez une fonction transformer(fonction, liste) qui renvoie la liste obtenue en appliquant
la fonction donnée à chaque élément de la liste donnée.
b- Evaluez transformer(f, l) lorsque f est la fonction f (x) = x2 et l la liste [1, 2, 3, 4, 5] (vous
devez obtenir la liste [1, 4, 9, 16, 25]).
2- Filtrage d’une liste.
a- Ecrivez une fonction filtrer(fonction, liste) qui renvoie la liste formée des éléments de la
liste donnée pour lesquels la fonction est vraie.
b- Evaluez filtrer(p, l) lorsque p est la fonction p(x) = « x est impair » et l la liste [1, 2, 3, 4,
5] (vous devez obtenir la liste [1, 3, 5]).
3- Cumul d’une liste.
a- Ecrivez une fonction cumuler(fonction, liste) qui renvoie le cumul des éléments de la liste
donnée pour l’opération binaire exprimée par la fonction donnée. On pourra considérer que
c’est une erreur que d’appeler cette fonction avec une liste ayant moins de deux éléments.
b- Evaluez cumuler(g, l) lorsque g est la fonction g(x, y) = x ∗ y et l la liste [1, 2, 3, 4, 5] (vous
devez obtenir 120, car 1 ∗ 2 ∗ 3 ∗ 4 ∗ 5 = 120).
4- Forme lambda. Les trois tests précédents vous ont obligés à définir trois fonctions (f , p et g)
qui sont très simples et ne servent qu’une fois.
1
feuille de TD Structures de données avancées
IAP 2014-2015
Nous avons vu en cours les fonctions lambda, ou anonymes. La valeur de l’expression :
lambda arguments : expression
est la même que la valeur qu’a f à la suite de la définition :
def f(arguments) :
return expression
Par exemple, la valeur de l’expression « lambda x, y : x + y » est la fonction addition.
a- Réécrivez les trois tests précédents en utilisant des formes lambda au lieu de définir les
fonctions f , p et g. Notez que ces trois fonctions sont disponibles dans la bibliothèque standard
de Python, sous les noms respectifs map, filter et reduce.
Exercice - 3 Représentation des graphes
Un graphe orienté est déterminé par un ensemble de sommets et un ensemble d’arcs (ou flèches)
dont chacun met en relation deux sommets, appelés l’origine et l’extrémité de l’arc. A chaque
sommet est associée une information (un nombre, une chaîne, etc.), appelée l’étiquette du sommet,
qui est unique : deux sommets distincts n’ont pas la même étiquette.
Il est possible de représenter un graphe en Python par une liste d’arcs. Chaque couple (o, e)
représente un arc du sommet o au sommet e. La liste d’arcs suivante décrit le graphe ci-dessous :
[ (’a’, ’b’), (’b’, ’a’), (’c’, ’a’), (’c’, ’d’), (’b’, ’c’),(’b’, ’d’), (’b’, ’e’), (’d’, ’e’) ]
1- Ecrivez les fonctions suivantes en prenant comme argument une liste d’arcs :
ensSommets(l_arcs), retourne l’ensemble (type set) des sommets du graphe
ensSuccesseurs(l_arcs, n), retourne l’ensemble des sommets si , tels qu’il existe un arc de n vers
si
ensPredecesseurs(l_arcs, n), retourne l’ensemble des sommets si , tels qu’il existe un arc de si
vers n
puits(l_arcs), retourne les sommets sans successeurs
sources(l_arcs), retourne les sommets sans prédécesseurs.
2- Testez soigneusement ces fonctions avec le graphe du dessus ainsi qu’avec le graphe suivant :
[ (’a’, ’b’), (’a’, ’c’), (’d’, ’e’), (’f’, ’e’) ]
La phase de test est-elle une étape qui vous paraît importante ?
3- Étant donnés deux sommets depart et arrivee on souhaite afficher tous les chemins sans boucle
qui joignent le sommet depart au sommet arrivee. Un tel chemin sera représenté dans notre programme par une suite de sommets : l’origine du chemin et les extrémités des arcs qui le composent.
Écrivez une fonction récursive chemins(graphe, chemin, arrivee) où graphe représente le graphe
donné, arrivee le sommet à atteindre et chemin le chemin en cours de construction (chemin est
une liste contenant lors du premier appel, un seul sommet : le sommet de départ) ; le rôle de cette
fonction est d’ajouter un arc valide au chemin et de se rappeler elle-même, avec ce chemin rallongé,
UPMC - Licence Biologie Mathématiques
2
feuille de TD Structures de données avancées
IAP 2014-2015
pour continuer le travail. Il faudra veiller à détecter le moment où la cible est atteinte et aussi à
empêcher le chemin de tourner en rond.
Exercice - 4 Représentation d’une arborescence
Une arborescence, ou arbre, est un ensemble muni d’une organisation hiérarchique : l’élément
tout en haut est appelé la racine et les autres éléments, s’il y en a, sont répartis en sous-ensembles
organisés de la même manière.
Par exemple, un livre a une structure d’arbre : il comporte un titre et est formé de chapitres ;
à son tour, chaque chapitre comporte son propre titre, et est divisé en sections ; chaque section a
également un titre, et est faite de sous-sections, etc. D’autres exemples évidents : les éléments d’un
système de fichiers, une entreprise ou une armée, etc.
On peut donner la définition récursive suivante : un arbre est un couple formé de :
— une information spécifique, qui dépend du problème considéré,
— une liste, éventuellement vide, d’arbres.
Ainsi, un arbre peut être représenté en Python par une doublet formé de :
— une donnée dont le type dépend du problème considéré, et
— une liste de structures bâties selon le même principe.
Par exemple, le doublet suivant : (’a’,[(’b’,[]),(’c’,[(’f’,[]),(’g’,[])]),(’d’,[]),(’e’,[(’h’,[])])]) représente
l’arbre dessiné ci-dessous.
1- Ecrivez la fonction afficher(arbre, marge) qui affiche l’arbre sous une forme plus facile à lire
que l’expression précédente : chaque information est sur une ligne, avec une marge à gauche qui
reflète la position hiérarchique (la profondeur) de l’élément. Plus précisément, cette fonction affiche
l’information portée par la racine de l’arbre en laissant à gauche la marge indiquée, puis se rappelle
elle-même sur chaque sous-arbre avec une marge augmentée. Dans le cas de l’expression ci-dessus,
cela donne l’affichage ci-dessous.
2- Ecrivez la fonction formater(arbre) qui produit l’expression de l’arbre donné selon la syntaxe :
— les informations ne sont pas encadrées de guillemets ou d’apostrophes,
— la représentation d’une feuille (i.e. un arbre sans sous-arbres) se réduit à l’information
correspondante,
— l’expression d’un arbre qui n’est pas une feuille est : ( racine, sous-arbre1 ,. . . , sous-arbrek
)
Par exemple, appliquée à l’arbre ci-dessus, cette fonction renvoie la chaîne :
(a, b, (c, f, g), d, (e, h)).
UPMC - Licence Biologie Mathématiques
3
feuille de TD Structures de données avancées
UPMC - Licence Biologie Mathématiques
IAP 2014-2015
4
Téléchargement