Vous êtes sur la page 1sur 45

1.

Algorithmique et Structures de Donnes


Jean-Charles Rgin

Licence Informatique 2me anne

JC Rgin - ASD - L2I - 2010

1.2

Itrations
Jean-Charles Rgin

Licence Informatique 2me anne

JC Rgin - ASD - L2I - 2010

Itration : dfinition
3

En informatique, litration est la rptition dun processus par un programme. Litration peut tre utilise
comme un terme gnral synonyme de rptition pour dcrire une forme spcifique de rptition qui modifie ltat courant.

Dans le sens premier, la rcursion est une forme particulire ditration. Cependant la notation rcursive est bien diffrente de la notion itrative. En mathmatiques, litration est trs couramment utilise : pour la somme, pour le produit
JC Rgin - ASD - L2I - 2010

Itrations : plan
4

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Indice du plus petit lment


5

On recherche lindice du plus petit lment dun tableau A partir de lindice i, on retrouve facilement la valeur de i puisque cest T[i] On balaie simplement tous les lments du tableau et on mmorise le plus petit

JC Rgin - ASD - L2I - 2010

Indice du plus petit lment


6

entier indicePlusPetit(T[],n) j 1 Pour i de 1 n { si (T[i] < T[j]){ j i } } retourner j entier indicePlusPetit(T[],n) j 1; i 1 Tant que (i n){ si (T[i] < T[j]){ j i } i i + 1 } retourner j

JC Rgin - ASD - L2I - 2010

Itrations : plan
7

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Recherche de dbut fin


8

Au lieu de parcourir tous les lments du tableau, on veut limiter la portion du tableau considr. Cela revient dire que lon considre un sous-tableau. On ne balaie plus tous les lments mais ceux entre lindice d (dbut) et lindice f (fin) (les deux indices inclus)

JC Rgin - ASD - L2I - 2010

Indice du plus petit element


9

entier indicePlusPetit(T[],n,d,f) j d Pour i de d f { si (T[i] < T[j]){ j i } } retourner j entier indicePlusPetit(T[],n,d,f) j d; i d Tant que (i f){ si (T[i] < T[j]){ j i } i i + 1 } retourner j

JC Rgin - ASD - L2I - 2010

Recherche de dbut condition


10

On introduit maintenant explicitement une condition darrt. Ce nest plus

on sarrte tel indice , mais on sarrte lorsquune condition est satisfaite


Par exemple T[i] vaut -1 Cette valeur ne doit pas tre prise en compte Elle nest pas forcment dans le tableau

JC Rgin - ASD - L2I - 2010

Recherche de dbut condition


11

entier indicePlusPetit(T[],n,d,val) j d Pour i de d ???? { // Cest compliqu !!! entier indicePlusPetit(T[],n,d,val) j d; i d Tant que (i n ET T[i] val ){ si (T[i] < T[j]){ j i } i i + 1 } retourner j Attention i n ET T[i] val et non pas

i n OU T[i] val T[i] val ET i n

JC Rgin - ASD - L2I - 2010

Recherche de dbut condition


12

Il manque le test T[d]=val

entier indicePlusPetit(T[],n,d,val) si (T[d] = val){ retourner -1 } j d; i d Tant que (i n ET T[i] val ){ si (T[i] < T[j]){ j i } i i + 1 } retourner j

JC Rgin - ASD - L2I - 2010

Recherche de dbut condition


13

Avec un rpter{ }jusqu (condition) entier indicePlusPetit(T[],n,d,val) si (T[d] = -1){ retourner -1 } j d; i d Rpter{ si (T[i] < T[j]){ j i } i i + 1 } jusqu (i > n ou T[i] = -1) retourner j

JC Rgin - ASD - L2I - 2010

Cas particulier pour le dbut et la fin


14

Assez souvent il est quasiment obligatoire de faire un traitement avant ou aprs la boucle, autrement dit pour le premier ou le dernier lment. Exemple :
On

crit son nom avec un espace entre les lettres conscutives : DUPONT donne D U P O N T Il ny a pas despace aprs la dernire lettre

JC Rgin - ASD - L2I - 2010

Cas particulier pour le dbut et la fin


15

afficherAvecEspaces(T[],n) pour i de 1 n-1 afficher(T[i]) afficher ( ) } afficher(T[n]) afficherAvecEspaces(T[],n) afficher(T[1]) pour i de 2 n afficher ( ) afficher(T[i]) }

JC Rgin - ASD - L2I - 2010

Itrations : plan
16

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Pas seulement une opration


17

Ce qui est fait dans la boucle peut tre complexe et dpendre des itrations prcdentes Exemple :
Un

tableau reprsente un nombre en binaire On veut faire la somme de 2 tableaux (mme taille) en tenant compte de la retenue

JC Rgin - ASD - L2I - 2010

Pas seulement une opration


18

T1 : [0 0 1 1 0 1 1 1] T2 : [1 0 1 0 0 0 1 1] + : [1 1 0 1 1 0 1 0]

JC Rgin - ASD - L2I - 2010

Pas seulement une opration


19

somme(T1[],T2[],R[],n) retenue 0 pour i de 1 n { s = T1[i] + T2[i] + retenue si (s = 0){ R[i] 0 retenue 0 } si (s = 1){ R[i] 1 retenue 0 } si (s = 2){ R[i] 0 retenue 1 } si (s = 3){ R[i] 1 retenue 1 } }

JC Rgin - ASD - L2I - 2010

Itrations : plan
20

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Une boucle et deux indices


21

Deux mots m et r

Dterminer si les lettres de m se trouvent dans le mot r dans le mme ordre. m = arme et r = algorithme : ca marche m = rame et r = algorithme : ca ne marche pas

m est compos de p lettres et r de n lettres

Boolen memeOrdre(m[],p,r[],n) i 1; k 1 // i dans m et k dans r tant que (i p ET k n){ si (m[i] = r[k]){ i i + 1 } k k + 1 } si (i > p){ retourner vrai } retourner faux
JC Rgin - ASD - L2I - 2010

Itrations : plan
22

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Boucles imbriques
23

Calcul du nombre dlments zro dans une matrice M(l,c) : l lignes et c colonnes

JC Rgin - ASD - L2I - 2010

Boucles imbriques
24

entier cpt pour j si }

numZeroLig(M[][],i,c) 0 de 1 c { (M[i][j] = 0){ cpt cpt + 1

} retourner cpt entier numZero(M[][],l,c) cpt 0 pour i de 1 l { cpt cpt + numZeroLig(M,i,c) } retourner cpt

JC Rgin - ASD - L2I - 2010

Boucles imbriques
25

Affichage dune matrice linarise T[(l-1)*numCol+c]=M[l][c]

afficherMatrice(T[],l,c) pour i de 1 l { pour j de 1 c { afficher(T[(i-1)*c+j]) afficher ( ) } afficher(\n) }


JC Rgin - ASD - L2I - 2010

Boucles imbriques
26

Multiplication de deux matrices de mme dimension

multMatrice(M1[][],M2[][],n,R[][]) pour i de 1 n { pour j de 1 n { s=0 pour k de 1 n { s s + M1[i][k] * M2[k][j] } R[i][j] s } }


JC Rgin - ASD - L2I - 2010

Itrations : plan
27

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Indirections
28

Prsentation habituelle de certains algorithmes :

On a un tableau dentiers On veut trier ce tableau

Un lment du tableau est directement un type de base (un entier, un flottant, un boolen...) Parfois on ne voudrait pas avoir accs la valeur en soi, mais plutt un objet li lindex et associ cette valeur On veut simplement parcourir les lments dun ensemble, pas uniquement les valeurs de ces lments : on associe llment une valeur
JC Rgin - ASD - L2I - 2010

Indirections
29

On veut associer plusieurs informations une personne


On

fait plusieurs tableaux globaux

Noms

des personnes Prnoms des personnes Date de naissance des personnes


Une

personne est reprsente par son indice

JC Rgin - ASD - L2I - 2010

Permutation
30

Proposer un algorithme qui permet de savoir si les lments dun tableau T forment une permutation de 1..n

JC Rgin - ASD - L2I - 2010

Permutation
31

Ide :
on

cre un tableau P de 1 n on met 0 dans chaque case on traverse T et pour la valeur T[i] on met un 1 dans la case P[T[i]] la fin si aucune case ne vaut 0 alors T est une permutation de P

JC Rgin - ASD - L2I - 2010

Permutation
32

Booleen estPermutation(T[],n) pour i de 1 n { P[i] 0 } pour i de 1 n { P[T[i]] 1 } ok vrai i 1 tant que (i n ET ok){ si (P[i] = 0){ ok faux } i i + 1 } retourner ok
JC Rgin - ASD - L2I - 2010

Tri par comptage


33

Quand on a des nombres de 1 p, on peut les trier facilement en comptant le nombre doccurrences de chaque nombre.
On

cre un tableau de p valeurs On met toutes ces valeurs 0 On traverse T. On compte le nombre de fois o T[i] est pris = on incrmente P[T[i]] Ensuite on balaie le tableau P et on copie autant de fois une valeur quelle apparait dans P
JC Rgin - ASD - L2I - 2010

Tri par comptage


34

Booleen tri(T[],n) min T[1]; max T[1] pour i de 1 n { si (T[i] < min){ min T[i] } si (T[i] > max) { max T[i] } } pour k de 1 (max-min+1) { P[k] 0 } pour i de 1 n { P[T[i]-min+1] P[T[i]-min+1] + 1 } i 1 pour k de 1 (max-min+1) { pour j de 1 P[k]{ T[i] k + min -1 i i + 1 } }

JC Rgin - ASD - L2I - 2010

Tri par comptage


35

Complexit ?

JC Rgin - ASD - L2I - 2010

Tri dindices
36

Que se passe-t-il si on veut trier des indices et non pas les valeurs ?
T

: [3, 2, 4 ,5, 3 ,7 ,5] T tri : [2, 3, 3, 4, 5 ,5, 7] Indices de T tris : [2, 1, 5, 3, 4, 7, 6]


Essayer

de trouver une solution !

JC Rgin - ASD - L2I - 2010

Tri par comptage


37

On va essayer de balayer le tableau T pour trouver la place des lments ! On va procder par accumulation

pour k de 1 (max-min+1) { P[k] 0 } pour i de 1 n { P[T[i]-min+1] P[T[i]-min+1] + 1 } On va maintenant accumuler la position dans P
pour k de 1 (max-min) { P[k+1] P[k+1]+P[k] }

P[i] contient maintenant le nombre dlments qui sont plus petits ou gal i
pour i de 1 n { pos P[T[i]] rang[pos] i P[T[i]] P[T[i]] - 1 }

JC Rgin - ASD - L2I - 2010

Itrations : plan
38

Une boucle simple : recherche du min, accs direct avec indice Cas particulier pour le dbut / la fin Pas seulement une opration Une boucle et deux indices Boucles imbriques : calcul de matrice Indirections : tri par comptage Itrateurs (itration et structures de donnes)
JC Rgin - ASD - L2I - 2010

Structures de donnes
1.39

Permettent de grer et dorganiser des donnes Sont dfinies partir dun ensemble doprations quelles peuvent effectuer sur les donnes Une structure de donnes ne regroupe pas ncessairement des objets du mme type.

JC Rgin - ASD - L2I - 2010

Itrateur
40

Un itrateur est un objet qui permet de parcourir tous les lments contenus dans un autre objet, le plus souvent un conteneur (liste, arbre, etc). Un synonyme d'itrateur est curseur, notamment dans le contexte des bases de donnes. Un itrateur dispose essentiellement de deux primitives :

accder l'lment en cours dans le conteneur, se dplacer vers l'lment suivant.

Il faut aussi pouvoir crer un itrateur sur le premier lment ; ainsi que dterminer tout moment si l'itrateur a puis la totalit des lments du conteneur. Diverses implmentations peuvent galement offrir des comportements supplmentaires.
JC Rgin - ASD - L2I - 2010

Itrateur
41

Le but d'un itrateur

permettre son utilisateur de parcourir le conteneur, c'est--dire d'accder squentiellement tous ses lments pour leur appliquer un traitement, isoler l'utilisateur de la structure interne du conteneur, potentiellement complexe. le conteneur peut stocker les lments de la faon qu'il veut, tout en permettant l'utilisateur de le traiter comme une simple liste dlments.

Avantage :

Le plus souvent l'itrateur est conu en mme temps que la classe-conteneur qu'il devra parcourir, et ce sera le conteneur lui-mme qui crera et distribuera les itrateurs pour accder ses lments
JC Rgin - ASD - L2I - 2010

Itrateur
42

on utilise souvent un index dans une simple boucle, pour accder squentiellement tous les lments, notamment d'un tableau; l'utilisation des itrateurs a certains avantages: Un simple compteur dans une boucle n'est pas adapt toutes les structures de donnes, en particulier

celles qui n'ont pas de mthode d'accs un lment quelconque celles dont l'accs un lment quelconque est trs lent (c'est le cas des listes chanes et des arbres).

Les itrateurs fournissent un moyen cohrent d'itrer sur toutes sortes de structures de donnes, rendant ainsi le code client plus lisible, rutilisable, et robuste mme en cas de changement dans l'organisation de la structure de donnes. Un itrateur peut implanter des restrictions additionnelles sur l'accs aux lments, par exemple pour empcher qu'un lment soit saut , ou qu'un mme lment soit visit deux fois.
JC Rgin - ASD - L2I - 2010

Itrateur
43

Un itrateur peut dans certains cas permettre que le conteneur soit modifi, sans tre invalid pour autant. Par exemple, aprs qu'un itrateur s'est positionn derrire le premier lment, il est possible d'insrer d'autres lments au dbut du conteneur avec des rsultats prvisibles. Avec un index on aurait plus de problmes, parce que la valeur de l'index devrait elle aussi tre modifie en consquence. Important : il est indispensable de bien consulter la documentation d'un itrateur pour savoir dans quels cas il est invalid ou non.
JC Rgin - ASD - L2I - 2010

Itrateur
44

Cela permet de faire des algorithmes sans connatre la structure de donnes sous-jacente. On recherche un plus court chemin dans un graphe :
On

ne sait pas comment le graphe est reprsent. Cela ne nous empche pas de faire un algorithme efficace

JC Rgin - ASD - L2I - 2010

Itrateur : en Java
45

Linterface java.util.Iterator permet lutilisation ditrateurs (iterator) avec les classes containers Chaque itrateur fournit les mthodes next() et hasNext() et peut supporter (non obligatoire) la mthode remove(). Un itrateur est typiquement cre par la classe container auquel il correspond, habituellement par la mthode iterator(). La mthode next() avance litrateur et renvoie la valeur pointe par litrateur. Quand un itrateur est cr, il pointe vers une valeur spciale qui est avant le premier lment, de telle faon que le premier lment est obtenu avec le premier appel de next() : Iterator iter = list.iterator(); while (iter.hasNext()){ System.out.println(iter.next()); } SI la fonction remove() est supporte, alors elle supprime llment le plus rcemment visit.
JC Rgin - ASD - L2I - 2010