ED2 Corrige
ED2 Corrige
ED2 Corrige
L d3 d4
d1
d2
Exercice II.2
Question 1 Que fait cette mthode ? La mthode qui_fait_quoi a pour rsultat la liste courante dans laquelle on a insr dans lordre llment x sil nexistait pas dj dans la liste (sans doublon). On suppose la liste courante non vide. Si x<premier lment, on insre entte de la liste Si x=premier lment, la liste est inchange. Sinon parcourir la liste jusqu' trouver la position de llment x dans la liste p.suivant.valeur x ou pointer vers le dernier lment p.suivant==null Si p.suivant.valeur == x, la liste est inchange Sinon insrer llment x, Liste q = new Liste(x,p.suivant) p.suivant=q ; Question 2 Voici la liste obtenue partir de la liste donne ci-dessus et APRES appel de qui_fait_quoi (20);
r 10
r.suivant.valeur = 17 r.suivant.suivant.valeur = 20 un peu plus ... et si, avec cette nouvelle liste r, on excute r.qui_fait_quoi (5), on obtient :
17
20
25
null
r 5 10 17 20 25
null
retourner r; fin
l 4 7 2 8 1
l 4 7 2 8 1
l 7 2 8 1
Etc la fin :
Question 2 Calculer la complexit de cette procdure. Si n est le nombre dlments (ou longueur) de la liste, alors la boucle sexcute n fois. Un passage par la boucle correspond 4 oprations. Donc la complexit de cette procdure est O(n).
Exercice II.4 Inversion rcursive d'une liste chane Illustration de lide de la rcursion : Une liste L non vide peut toujours tre considre comme la juxtaposition de son premier lment (ou de son en_tte), que nous notons x, avec une autre liste L (qui est en fait L prive de x). x
Reste de L (ou L)
Inverse(L) Question 1
Elt en_tete { debut retourner this.valeur ; fin
Question 2
public Liste inverser (){ //inversion recursive Liste l = this ; if ( l.suivant == null) return this ; Elt x = l.entete(); l=l.suivant; //l est alors tronque de son entete l=l.inverser() ; //appel rcursif l.insererenqueue (x); return (l); }
Question 3 Calculer la complexit de cette procdure. Exemple dexcution : Si n est le nombre dlments de la liste, alors la procdure inversion est invoque n fois.
4
arrt
Inversion{a,b,c} Inversion{b,c} Inversion{c} Inversion{}
A chaque fois, il faut au pire n oprations pour effectuer linsertion en queue. Cette procdure est donc en O(n2). A comparer avec la procdure dinversion de la question prcdente.
On peut permuter les contenus des lments extrmes, par paires. On permute 1 et n, puis 2 et (n-1), puis 3 et (n-2), . Si n est pair, tous les lments sont permuts 2 deux et cela fait n/2 permutations. Si n est impair, llment central ne change pas et cela fait (n-1)/2 permutations. Question 2 crire la mthode inverser et calculer sa complexit.
Liste inverser Indice milieu; Elt tamp ; dbut Indice n = this.longueur; milieu = n / 2; -- division entire pour i allant de 1 milieu faire -- permutation des lments dindice i et n-i+1 tamp = tab[n-i+1]; tab [n-i+1]= tab[i]; tab[i ]=tamp; fait fin
De lordre de n/2 passages dans la boucle pour (3 oprations lmentaires chaque fois) donc la complexit est O(n).