Université de Nice-Sophia Antipolis POLYTECH CiP2 2010â2011 ...
Université de Nice-Sophia Antipolis POLYTECH CiP2 2010â2011 ...
Université de Nice-Sophia Antipolis POLYTECH CiP2 2010â2011 ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Université <strong>de</strong> <strong>Nice</strong>-<strong>Sophia</strong> <strong>Antipolis</strong><br />
<strong>POLYTECH</strong><br />
<strong>CiP2</strong> 2010–2011<br />
Examen <strong>de</strong> Algorithmique et Programmation<br />
Durée : 1h30 minutes<br />
Aucun document autorisé Note : la qualité <strong>de</strong>s commentaires, avec notamment la présence<br />
d’affirmations significatives, ainsi que les noms donnés aux variables, l’emploi à<br />
bon escient <strong>de</strong>s majuscules et la bonne in<strong>de</strong>ntation rentreront pour une part importante<br />
dans l’appréciation du travail.<br />
◮ 1. Écrivez la définition (ensembles, fonctions et axiomes) du type abstraitPile comme<br />
vu en TD.<br />
Question sur 3 points<br />
Ensembles :<br />
Pile utiliseE et booléen<br />
pilevi<strong>de</strong>∈Pile<br />
Fonctions :<br />
Axiomes :<br />
empiler : Pile×E → Pile<br />
dépiler : Pile → Pile<br />
sommet : Pile → E<br />
est-vi<strong>de</strong> : Pile → booléen<br />
1. ∀p∈Pile,∀e∈E<br />
2. est-vi<strong>de</strong>(pilevi<strong>de</strong>)=vrai<br />
3. est-vi<strong>de</strong>(empiler(p,e))=faux<br />
4. dépiler(empiler(p,e))= p<br />
5. sommet(empiler(p,e))=e<br />
6. ∄ p, p=dépiler(pilevi<strong>de</strong>)<br />
7. ∄e, e=sommet(pilevi<strong>de</strong>)<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 2. Une classe ListeChaînée implémente les fonctions longueur, ième, supprimer et<br />
insérer d’une interface Liste comme vue en TD. Par héritage <strong>de</strong> ListeChaînée,<br />
écrivez la classe PileChaînée qui implémente une interface Pile.<br />
1
Question sur 3 points<br />
p u b l i c c l a s s PileChaînée extends ListeChaînée <br />
implements Pile <br />
{<br />
/**<br />
* Rôle : construit une pile vi<strong>de</strong>. Les éléments<br />
* <strong>de</strong> la pile pourront être <strong>de</strong> types différents<br />
*/<br />
p u b l i c PileChaînée () {<br />
super ();<br />
}<br />
/**<br />
* Rôle : teste si la pile est vi<strong>de</strong> ou non<br />
*<br />
* @return un boolean<br />
*/<br />
p u b l i c boolean estVi<strong>de</strong> () {<br />
return longueur () == 0;<br />
}<br />
/**<br />
* Rôle : retourne le sommet <strong>de</strong> la pile<br />
* @return un T<br />
* @exception PileVi<strong>de</strong>Exception si la pile<br />
* est vi<strong>de</strong><br />
*/<br />
p u b l i c T sommet () throws PileVi<strong>de</strong>Exception {<br />
i f ( estVi<strong>de</strong> ())<br />
throw new PileVi<strong>de</strong>Exception ();<br />
return ième (1);<br />
}<br />
/**<br />
* Rôle : empile un objet en sommet <strong>de</strong> pile<br />
* @param o T, est l’objet à empiler<br />
*/<br />
p u b l i c void empiler (T e) {<br />
insérer (1 ,e);<br />
}<br />
/**<br />
* Rôle : enlève l’élément en sommet <strong>de</strong> pile<br />
* @exception PileVi<strong>de</strong>Exception si la pile<br />
* est vi<strong>de</strong><br />
*/<br />
p u b l i c void dépiler () throws PileVi<strong>de</strong>Exception {<br />
i f ( estVi<strong>de</strong> ())<br />
throw new PileVi<strong>de</strong>Exception ();<br />
supprimer (1);<br />
}<br />
}<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 3. La classe ArbreBinaireChaîné définit l’implémentation d’arbres binaires comme<br />
vus en TD. Deux arbres binaires a et b sont miroirs s’ils possè<strong>de</strong>nt la même racine, si le<br />
sous-arbre gauche <strong>de</strong> a est le miroir du sous-arbre droit <strong>de</strong> b et si le sous-arbre droit <strong>de</strong><br />
2
a est le miroir du sous-arbre gauche <strong>de</strong> b. Ajoutez à la classe ArbreBinaireChaîné<br />
la métho<strong>de</strong> créerMiroir qui retourne l’arbre miroir <strong>de</strong> l’arbre courant this.<br />
Question sur 3 points<br />
/**<br />
* Rôle : retourne un arbre binaire miroir <strong>de</strong> this<br />
*/<br />
p u b l i c ArbreBinaire créerMiroir () throws ArbreVi<strong>de</strong>Exception<br />
{<br />
return t h i s . estVi<strong>de</strong> () arbreVi<strong>de</strong> :<br />
// this non vi<strong>de</strong><br />
new ArbreBinaireChaîné ( t h i s . valeur () ,<br />
t h i s . créerMiroir ( t h i s . sad ()) , t h i s . créerMiroir ( t h i s . sag ()));<br />
}<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 4. Un arbre binaire complet est un arbre dont les nœuds, qui ne sont pas <strong>de</strong>s feuilles,<br />
possè<strong>de</strong>nt toujours <strong>de</strong>ux sous-arbres. Écrivez la métho<strong>de</strong> estComplet qui retourne un<br />
booléen : vrai si l’arbre binaire courant est complet, et faux sinon.<br />
Question sur 4 points<br />
/**<br />
* Rôle : retourne vrai si l’arbre courant (this) est complet<br />
* et faux sinon. Note un arbre vi<strong>de</strong> est complet.<br />
*/<br />
p u b l i c boolean estComplet () throws ArbreVi<strong>de</strong>Exception {<br />
return estVi<strong>de</strong> () true : estComplet ( t h i s );<br />
}<br />
/**<br />
* Rôle : retourne vrai si l’arbre a complet<br />
* et faux sinon<br />
* Antécé<strong>de</strong>nt : a non vi<strong>de</strong><br />
*/<br />
p r i v a t e boolean estComplet ( ArbreBinaire a)<br />
throws ArbreVi<strong>de</strong>Exception<br />
{<br />
}<br />
assert !a. estVi<strong>de</strong> ();<br />
i f (a. sag (). estVi<strong>de</strong> () && a. sad (). estVi<strong>de</strong> ()) return true ;<br />
return a. sag (). estVi<strong>de</strong> () || a. sad (). estVi<strong>de</strong> () <br />
// un <strong>de</strong>s <strong>de</strong>ux arbres est vi<strong>de</strong> et pas l’autre<br />
f a l s e :<br />
// les 2 sous-arbres ne sont pas vi<strong>de</strong>s => poursuivre le test<br />
a. sag (). estComplet () && a. sad (). estComplet ();<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 5. Quelle est les complexités théoriques moyennes, en termes <strong>de</strong> comparaisons et <strong>de</strong><br />
transferts, du tri par insertion séquentielle vu en TD Expliquez.<br />
3
Question sur 2 points<br />
Pour ce tri, il y a n−1 étapes, et dans le cas moyen, à chaque étape, si les clés<br />
sont réparties <strong>de</strong> façon équiprobable, il y a<br />
2 i comparaisons. Le nombre moyen <strong>de</strong><br />
comparaisons est donc ∑ n i=2 2 i = 1 4 (n2 + n−2), La complexité moyenne en terme <strong>de</strong><br />
comparaisons <strong>de</strong> ce tri est doncO(n 2 ).<br />
À chaque étape, le nombre <strong>de</strong> déplacements est égal au nombre <strong>de</strong> comparaisons<br />
plus un. En moyenne, il est <strong>de</strong> 1 4 (n2 + n+2). La complexité moyenne en terme <strong>de</strong><br />
transferts <strong>de</strong> ce tri est aussiO(n 2 )<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 6. Écrivez la métho<strong>de</strong> TriDicho qui trie une liste générique par insertion avec recherche<br />
dichotomique du rang d’insertion.<br />
Question sur 4 points<br />
/**<br />
* Rôle : trie par insertion dichotomique la liste courante (this)<br />
* Antécé<strong>de</strong>nt : c comparateur <strong>de</strong>s clés <strong>de</strong>s éléments <strong>de</strong> la liste courante<br />
*/<br />
p u b l i c void triDicho ( Comparateur c) {<br />
f o r ( i n t i =2; i clé(ième(milieu))<br />
gauche = milieu +1;<br />
}<br />
// gauche est le rang d’insertion<br />
// décaler tous les éléments <strong>de</strong>puis ce rang jusqu’à i-1<br />
f o r ( i n t j=i -1; j >= gauche ; j - -)<br />
affecter (j+1 , ième (j ));<br />
// mettre l’élément clé au rang gauche<br />
affecter ( gauche ,x);<br />
}<br />
}<br />
}<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
◮ 7. Modifiez la métho<strong>de</strong> <strong>de</strong> tri rapi<strong>de</strong> (quicksort) afin qu’elle retourne la valeur médiane<br />
d’une liste générique. On rappelle que la valeur médiane divise une liste en <strong>de</strong>ux souslistes<br />
<strong>de</strong> même taille telles que tous les éléments <strong>de</strong> la première sont inférieurs ou égaux<br />
à la médiane, et tous éléments <strong>de</strong> la secon<strong>de</strong> lui sont supérieurs ou égaux.<br />
4
Question sur 3 points<br />
/**<br />
* Rôle : recherche <strong>de</strong> la médiane <strong>de</strong> la liste courante (this)<br />
* La métho<strong>de</strong> est basée sur l’algorithme du tri rapi<strong>de</strong><br />
* Antécé<strong>de</strong>nt : c comparateur <strong>de</strong>s clés <strong>de</strong>s éléments<br />
* <strong>de</strong> la liste courante<br />
*/<br />
p u b l i c Élément médiane ( Comparateur c) {<br />
return médiane ( t h i s , c, (1+ t h i s . longueur ())/2 , 1, t h i s . longueur ());<br />
}<br />
p r i v a t e Élément médiane ( Liste < Élément > l, Comparateur c,<br />
i n t k, i n t gauche , i n t droite ) {<br />
i n t i= gauche , j= droite ;<br />
C pivot = l. ième (k). clé ();<br />
do {<br />
while (c. inférieur (l. ième (i). clé () , pivot )) i ++;<br />
while (c. supérieur (l. ième (j). clé () , pivot )) j - -;<br />
i f (i