Documente Academic
Documente Profesional
Documente Cultură
NOTES DE COURS
M. DELEST 2007
Universit Bordeaux 1
INF102 - 2007
INF102 - 2007
Introduction
Notion d'algorithme Notion de Complexit Langage de description d'algorithmes
1. Notion d'algorithme
Dfinition 1.1. Un algorithme est une procdure de calcul bien dfinie qui prend en entre un ensemble de valeurs et qui dlivre en sortie un ensemble de valeurs. Exemple 1.1 Problme : Trier une suite de nombres entiers dans l'ordre croissant. Entre : Suite de n nombres entiers (a1, a2, ...an) Sortie : Une permutation de la suite donne en entre (a'1, a'2, ...a'n) telle que a'1a'2, ...a'n. A partir de la suite (6,9,2,4), un algorithme de tri fournira le rsultat (2,4,6,9). Dfinition 1.2.Une valeur particulire de l'ensemble des valeurs donnes en entre est appele instance du problme. Exemple 1.1 (suite) La valeur (6,9,2,4) est une instance du problme. Dfinition 1.3.Un algorithme est correct si pour toute instance du problme il se termine et produit une sortie correcte. Les algorithmes peuvent tre spcifis en langage humain ou tout langage informatique. Dans ce qui suit nous utiliserons un langage proche du langage naturel. Nous donnerons une implmentation en Python (voir cours MISMI MIS 102) Dfinition 1.4.Une heuristique est une procdure de calcul correcte pour certaines instances du problme (c'est dire se termine ou produit une sortie correcte). Ce cours n'aborde pas les heuristiques. Pour qu'un algorithme puisse tre dcrit et s'effectue, les donnes d'entres doivent tre organises. Dfinition 1.5.Une structure de donnes est un moyen de stocker et d'organiser des donnes pour faciliter leur stockage, leur utilisation et leur modification. De nombreux problmes ncessitent des algorithmes : Bio-informatique Moteur de recherche sur Internet Commerce lectronique
INF102 - 2007
Affectation de tches Dfinition 1.6. L'efficacit d'un algorithme est mesur par son cot (complexit)en temps et en mmoire.
Une problme NP-complet est un problme pour lequel on ne connait pas d'algorithme correct efficace c'est dire ralisable en temps et en mmoire. Le problme le plus clbre est le problme du voyageur de commerce. L'ensemble des problmes NP-complets ont les proprits suivantes : Si on trouve un algorithme efficace pour un problme NP complet alors il existe des algorithmes efficaces pour tous, Personne n'a jamais trouv un algorithme efficace pour un problme NP-complet, personne n'a jamais prouv qu'il ne peut pas exister d'algorithme efficace pour un problme NP-complet particulier.
2. Notion de complexit
L'efficacit d'un algorithme est fondamentale pour rsoudre effectivement des problmes. Exemple1.2. Supposons que l'on dispose de deux ordinateurs. L'ordinateur A est capable d'effectuer 109 instructions par seconde. L'ordinateur B est capable d'effectuer 107 instructions par seconde. Considrons un mme problme (de tri par exemple) dont la taille des donnes d'entres est n. Pour l'ordinateur A, on utilise un algorithme qui ralise 2n2 instructions. Pour l'ordinateur B, on utilise un algorithme qui ralise 50nlog(n) instructions. Pour traiter une entre de taille 106 : l'ordinateur A prendra 2000s et l'ordinateur B prendra 100s. Ainsi mme si la machine B est mdiocre, elle rsoudra le probme 20 fois plus vite que l'ordinateur A. Dfinition 1.1. La complexit d'un algorithme est en temps, le nombre d'oprations lmentaires effectues pour traiter une donne de taille n, en mmoire, l'espace mmoire ncessaire pour traiter une donne de taille n. Dans ce cours, nous considrerons que la complexit des instructions lmentaires les plus courantes sur un ordinateur ont un temps d'excution que l'on considrera dans ce cours comme constant gal 1. Les instructions lmentaires sont : addition, multiplication, modulo et partie entire, affectation, instruction de contrle. Ce qui intresse fondamentalement l'algorithmique c'est l'ordre de grandeur (au voisinage de l'infini) de la fonction qui exprime le nombre d'instructions. Les courbes de rfrences sont ici.
INF102 - 2007 Il est ncessaire de disposer d'un langage qui soit non li l'implmentation. Ceci permet une description plus prcise des structures de donnes ainsi qu'une rdaction de l'algorithme plus souple et plus "lisible". Le langage EXALGO est un exemple de ce qui peut tre utilis et qui sera utilis dans ce cours. Il est compos de chanes de caractres alphanumriques, de signes opratoires (+,-,*,/,<,<=,>=,>,<>,==,=,ou,non,et ), de mot-cls rservs, et de signes de ponctuation : ''=, ;,(,), dbut, fin, //. Les balises dbut et fin peuvent tre remplacs par { et }.
Remarque. Python n'utilise pas de marqueurs de fin. Le caractre : est le marqueur de dbut et quand l'indentation cesse Python considre que c'est un marqueur de fin.
INF102 - 2007
1. Dfinitions
Dfinition 2.1. Un type abstrait est un triplet compos : d'un nom, d'un ensemble de valeurs, d'un ensemble d'oprations dfinies sur ces valeurs. Les types abstrait de bases de l'algorithmique sont : entier,caractres,boolen,rl que l'on crit respectivement en EXALGO entier,car,boolen,rl Dfinition 2.2. Une variable est un triplet compos d'un type (dj dfini), d'un nom (a priori toute chane alphanumrique), d'une valeur. On crit en EXALGO
var NomDeVariable: Type;
Type est prendre pour l'instant dans l'ensemble {entier,car,boolen,rl} Dfinition 2.3. Les Expressions sont constitues l'aide de variables dj dclares, de valeurs, de parenthses et d'oprateurs du (des)type(s) des variables concernes. Dfinition 2.4. L'affectation est l'instruction qui permet de stocker une valeur dans une variable. On crit
NomDeVariable=ExressionDuTypeDeLaVariable;
2. Types de base
Boolens
Une variable de type boolen prend comme valeur VRAI ou FAUX. Les oprations usuelles sont ET, OU et NON qui sont donnes dans les tables qui suivent.
INF102 - 2007
Entiers
Une variable de type entier peut prendre comme valeur l'ensemble des nombres entiers signs. Les oprations associes sont les oprations usuelles +,-,*,/.
Rls
Une variable de type rl peut prendre comme valeur l'ensemble des nombres rels. Les oprations associes sont les oprations usuelles +,-,*,/.
Caractres
Une variable de type car peut prendre comme valeur l'ensemble des caractres imprimables. On notera les valeurs entre guillemets. On considre souvent que les caractres sont ordonns dans l'ordre alphabtique.
Attention
Les valeurs "1" qui est un caractre, 1 qui est un entier, 1. qui est un rel sont diffrentes et ne seront pas cods de la mme manire dans la mmoire de la machine.
Comparaison
Les oprateurs <, , ==, !=, >, permettent de comparer les valeurs de type entier, rel et caractre. Le rsultat de cette comparaison est une valeur boolenne.
3. Structures de contrle
Il y a trois structures principale de contrle qui permettent de construire des algorithmes Bloc d'instruction
dbut instruction1 instruction2 ............. fin
Rptition L'instruction exit permet d'arrter la rptition. le bloc d'instruction peut ne pas tre xcut (traduction Python):
7
INF102 - 2007
le bloc d'instruction peut ne pas tre excut et il y a une variable indicatrice (traduction Python):
pour VariableIndicatrice allant de ValeurInitiale ValeurFinale par pas de ValeurPas faire BlocInstruction finpour;
le bloc d'instruction est excut au moins une fois (ne se traduit pas directement en Python)
rpter BlocInstruction jusqu' ExpressionBoolenne finrpter;
4. Fonctions
Une fonction est une section d'algorithme qui a un objectif bien dfini et un nom. En gnral, elle communique avec l'extrieur par le biais de paramtres typs. Elle possde des variables locales qui ne sont pas visibles l'extrieur de la fonction. Ces variables peuvent tre des fonctions. Une fonction retourne une valeur par l'instruction simple retourne(Expression). L'expression peut tre vide, tout s'est bien pass mais il n'y a pas de rsultat retourner : retourne() sans rsultat, il est impossible de retourner un rsultat suite un cas de figure de l'instance : retourne(NUL)
Syntaxe
Ecriture de la fonction
fonction NomDeFonction (ListeParamtres):TypeRsultat; //dclarations des variables ou fonctions locales autres que les paramtres dbut // partie instruction qui contient l'appel retourne fin finFonction
liste des paramtres Les paramtres sont passs par rfrence ref, on crit ref ListeVariable:NomDeType la fonction travaille directement dans la variable passe en paramtre, par valeur val, on crit val ListeVariable:NomDeType la fonction travaille sur une copie de la variable passe en paramtre. Le type du rsultat est vide si la fonction ne renvoie pas de rsultat.
Utilisation
Une fonction s'utilise en crivant NomDeFonction(ListeInstanceParamtres) dans le calcul d'une expression si la fonction retourne une valeur, comme une instruction simple si elle ne retourne pas de valeur.
Exemple
fonction exemple(val n:entier;ref m: entier):vide; dbut n=5; m=7; fin finFonction
INF102 - 2007
INF102 - 2007
Generalits
Le langage EXALGO est compos de chanes de caractres alphanumriques, de signes opratoires, de mot-cls rservs, et de signes de ponctuation : =, ;,(,), dbut, fin, //. Les marqueurs de fin, dbut et fin peuvent tre remplacs par { et } lorsqu'il y a encombrement.
Type
Types prdfinis : entier,car,boolen,rl Dfinition de type :
type NomDeType= TypePrdfini;
Variables
var NomDeVariable: TypePrdfini;
Expressions
Consitues l'aide de variables dj dclares, de parenthses et d'oprateurs du (des) type(s) des variables concernes.
Instructions simples
affectation :
NomDeVariable=ExressionDuTypeDeLavariable;
Structure de contrle
Bloc d'instruction :
instruction1 instruction2 .............
Alternative:
si ExpressionBoolenne alors BlocInstruction1 sinon BlocInstruction2 finsi;
Alternative multiple:
selon que cas cas1 : BlocInstruction1 cas cas2 : BlocInstruction2 ............. autrement : BlocInstruction finselonque Rptition : exit permet d'arrter la rptition
10
INF102 - 2007
le bloc d'instruction peut ne pas tre excut et il y a une variable indicatrice pour VariableIndicatrice allant de ValeurInitiale ValeurFinale par pas de ValeurPas faire BlocInstruction finpour; le bloc d'instruction est excut au moins une fois rpter BlocInstruction jusqu' ExpressionBoolenne finrpter;
Fonctions
Une fonction retourne une valeur par l'instruction simple( retourne(Expression)). Une fonction s'utilise dans le calcul d'une expression ou comme instruction simple. Ecriture de la fonction
fonction NomDeFonction (ListeParamtres):Typersultat; //dclarations des variables locales autres que les paramtres dbut // partie instruction qui contient l'appel retourne() fin finFonction
liste des paramtres Les paramtres sont passs par rfrence ref, on crit ref ListeVariable:NomDeType par valeur val, on crit val ListeVariable:NomDeType Le type du rsultat est vide si la fonction ne renvoit pas de rsultat.
Types
Type structur Un type structur est constitu partir de types de base ou d'autres types dclars.
type NomDeType: structure champ1:NomDeType1 champ2:NomDeType2 ........................... finstructure
Aprs la dclaration
var E:NomDeTypeEnregistrement
on accde au diffrents champs par le nom de la variable suivi d'un point suivi du nom de champ (E.champ1) Type pointeur Si O est un objet de type T, on accde l'objet par O^. Si on dclare :
var P:^NomDeType
alors on peut obtenir un objet accessible par allouer(P). Lorsqu'on n'utilise plus l'objet, il faut librer l'espace qu'il utilise par desallouer(P).
11
INF102 - 2007
Structures de donnes
Dfinition Structures Table d'association cl unique
1. Dfinition
Dfinition 3.1. Une squence sur un ensemble E est une suite d'lments (e1,e2,...en) d'lments de E. Une squence peut contenir des lments identiques de l'ensemble E. Exemple 3.1 (3,5,8,2,12,6) est une squence d'lments de N, ensemble des entiers naturels. ("a","z","T","A","a") est une squence sur l'ensemble des caractres imprimables(char). Il existe plusieurs variantes de squences suivant les oprations de manipulation autorises : accs par l'indice de l'lment ou non, accs la fin de la squences ou non, .... On utilisera en gnral des noms particuliers dpendants des caractristiques de la squence. Exemple 3.2 Un vecteur peut tre dfini par une squence dans laquelle l'accs aux lments se fait par son indice et la taille de la squence dpend de l'espace dans lequel on se trouve. On dit aussi qu'on a un accs direct l'lment. Dans la plupart des langages de programmation, le vecteur existe sous le nom d'array. Exemple 3.3 Soit la procdure calculant la factorielle
fonction fac(val n:entier):entier; begin if n<=1 alors retourner(1) sinon retourner(n*fac(n-1)) finsi finfonction Programme Python
12
La squence des valeurs de n au cours des appels rcursifs doit tre mmorise. Supposons l'appel fac(4) alors il y aura appel de fac(3), la mmorisation de n se fera par la squence L=(4) il y aura appel de fac(2), la mmorisation de n se fera par la squence L=(3,4) il y aura appel de fac(1), la mmorisation de n se fera par la squence L=(2,3,4) aprs excution de fac(1), et la valeur est supprime en tete de
INF102 - 2007 squence L=(3,4) aprs excution de fac(2), n prend pour valeur la tte de la squence et la valeur est supprime en tete de squence L=(4) aprs excution de fac(3), n prend pour valeur la tte de la squence et la valeur est supprime en tete de squence L=()
2. Structure
Soient F1,F2,... ,Fp des ensembles. Dfinition 3.2. Une structure sur F1xF2x...xFp est une squence (f1,f2,...fk) telle que
Les structures sont des cas particuliers de squences. En algorithmique, chaque ensemble Fi peut tre un type de base ou une structure. ce mcanisme permet de dfinir de nouveaux types plus complexes que les types de base. En EXALGO, on crit
nom_du_type=structure nom_champs_1:type1; nom_champs_2:type2; ....... nom_champs_k:typek; finstructure.
Ceci signifie que lorsqu'une variable est dclare de ce type, elle rfrence k variables en mme temps. Soit V une variable dont le type est une structure, on dsigne un des champs par V. suivi du nom du champs. Exemple 3.4 Une date de naissance est un exemple de structure. On peut ecrire :
dateDeNaissance=structure jourDeNaissance:entier; moisDeNaissance:entier; anneDeNaissance:entier; finstructure.
Soit la dclaration
var I:individu
alors I.sexe sera un boolen et I.date.jourDeNaissance sera un entier. Ainsi les instructions suivantes ont un sens:
I.date.jour=12; I.sexe=false;
13
INF102 - 2007
Dfinition 3.3 Soit F un ensemble. Une table d'association cl unique est une squence d'lments de NxF (N est l'ensemble des entiers naturels), ((c1,f1),(c2,f2),...,(ck,fk)) telle que
Les tables d'association sont un cas particulier de squence d'lments structurs. La structure se dcrit en EXALGO
association=structure cle:entier; valeur:type_prdfini; finstructure
Exemple 3.5 Lors de l'activation du compte lectronique, l'tudiant de l'Universit Bordeaux 1 fournit un numro INE qui sera associ un mot de passe. On a donc quelque part dans le systme de gestion des comptes une table d'association index unique dont l'lment de squence est :
Etudiant=structure INE:entier; motDePasse:typeMotDePasse; finstructure
14
INF102 - 2007
Complexit
Dfinitions Structures de contrle Exemples
1. Dfinitions
Dfinition 4.1.(Notation de Landau) On dit que f=O(g) s'il existe deux nombres rls k,a > 0 tels que pour tout x>a, |f(x)|k|g(x)|. Exemple 4.1. Si le nombre d'instructions est gal f(n)=a n2 + b n + c avec a,b,c des constantes relles, alors f(n)=O(n2). Les figures permettent de comparer les fonctions usuelles utilises pour dcrire la complexit d'un algorithme en fonction de la taille n des donnes d'entres. Parmi les fonctions usuelles, le log base 2 de n (log2(n)) joue un rle important. Pour un algorithme A, notons CA(D), le cot de l'algorithme A pour une instance D. Dfinition 4.2. On dfinit les trois complexits suivantes : Complexit dans le pire des cas C>A(n)=max{CA(d),d donne de taille n} Complexit dans le meilleur des cas C<A(n)=min{CA(d),d donne de taille n} Complexit en moyenne
o Pr(d) est la probabilit d'avoir en entre une instance d parmi toutes les donnes de taille n.
Soit Dn l'ensemble des instances de taille n. Si toutes les instances sont quiprobables, on a
Parfois, il est ncessaire d'tudier la complexit en mmoire lorsque l'algorithme requiert de la mmoire supplmentaire (donne auxiliaire de mme taille que l'instance en entre par exemple).
15
INF102 - 2007
2. Structures de contrle
Les algorithmes font intervenir les opration lmentaires suivantes: oprations lmentaires +,-,*,/ test d'expression boolenne appel de fonctions. Les complexits en temps des structures sont donnes ci-dessous Bloc d'instruction : somme des cots des instructions Alternative Alternative simple : un test Alternative multiple : complexit minimum : un test complexit maximum : nombre de cas possible-1 Rptition Soit BT(n)(resp. BO(n)) la complexit en nombre de tests (resp. d'oprations lmentaires) de la suite d'instructions itrer, et k le nombre de fois ou l'itration s'effectue alors la complexit sera de . k BT(n)+1 pour le nombre de tests k BO(n) pour le nombre d'oprations du tant que et du rpter k (BO(n)+1) pour le nombre d'oprations du pour
3. Exemples
Somme des N premiers entiers
fonction suite(val n:entier):entier; var i,s:entier; dbut s=0; pour i allant de 1 n faire s=s+i; finpour; retourner(s) fin finfonction;
16
finFonction
INF102 - 2007
Source Python C>pile(n)= O(n) (On ne tire jamais de Pile) C<pile(n)= O(1) (On tire un Pile le premier coup) Les faces du d apparaissent de manire quiprobables et les tirages sont indpendants. On peut montrer que le cot moyen de l'algorithme est Cpile(n)=O(1).
17
INF102 - 2007
nlog(n), n2, n3
18
n2, 1.5n, 2n
INF102 - 2007
2n, nn, n!
19
INF102 - 2007
Formule de Stirling
20
INF102 - 2007
Tableaux
Dfinition Primitives Quelques exemples d'algorithmes Matrices
1. Dfinition
Dfinition 5.1. Un tableau est une table d'association cl unique telle que le nombre d'lments de la table (dimension ou taille) est constant, l'accs aux lments s'effectue directement par la cl, les valeurs minimum et maximum des cls sont des constantes. On crit en EXALGO
nom_tableau=tableau[min_indice..max_indice] de type_predefini;
ce qui signifie que les lments ont pour type le type_prdfini les indices des lments vont de min_indice max_indice, avec min_indice<max_indice, La taille du tableau est donc max_indice-min_indice+1. Pour accder un lment d'un tableau T d'indice I, on crit T[I]. La complexit de l'accs un lment du tableau est O(1). Notation Soit min_indice<i<j<max_indice, notera T[i..j] la squence des lments de T (T[i],T[i+1],...,T[j]). Beaucoup d'algorithmes peuvent tre dcrits sans prciser un type particulier. Dans ce cas, on crira la place de type_prdfini le mot lment et on prcisera les valeurs possibles pour lment. Exemple 5.1. Soit deux tableaux TC=tableau[1..10]de car; TE=tableau[1..10]d'entiers; L'algorithme qui permet de trier TC et TE est le mme. Seul diffre le type de l'lment manipul. On crirera dans ce cas un algorithme sur un tableau T=tableau[1..10]d'lments; et on prcisera que lment est dans {car,entier}.
2. Primitives
Les paramtres tableaux doivent, sauf raison majeure, tre passs en paramtre par rfrence afin d'viter la recopie.
21
INF102 - 2007
fonction init(ref T:tableau[min_indice..max_indice] d'lments; val valeurInitiale:lment):vide; var i:entier; dbut pour i allant de min_indice max_indice faire T[i]= valeurInitiale finpour fin finfonction
Complexit: O(n).
Complexit: O(1).
Echange d'lments
fonction echange(ref T:tableau[min_indice..max_indice] d'lment; val indice1,indice2: entier):vide; var e:lment; dbut e=T[indice1]; T[indice1]=T[indice2]; T[indice2]=e; fin finfonction
Complexit: O(1).
Copie de tableau
fonction copie(ref T1,T2:tableau[min_indice..max_indice] d'lment; val indiceT1_1,indiceT1_2,indiceT2: entier):booleen; var i:entier; dbut si indiceT2+indiceT1_2-indiceT1_1>max_indice alors retourner(faux) sinon pour i allant de indiceT1_1 indiceT1_2 faire T2[indiceT2]=T1[i]; indiceT2=indiceT2+1; finpour retourner(vrai) fin finfonction
22
INF102 - 2007
Complexit: O(n)
Complexit : O(n)
4. Matrices
Dclaration
Une matrice M de dimension nxm est un tableau de dimension n dont chaque lment est un tableau de dimension m. On peut donc dclarer la matrice sous la forme suivante
23
INF102 - 2007
Initialisation
fonction initMatrice(ref M:tableau[1..n] de tableau [1..m] val valeurInitiale:lment):vide; var i,j:entier; dbut pour i allant de 1 n faire pour j allant de 1 m faire M[i][j]=valeurInitiale finpour finpour retourner() finfonction
d'lments;
Complexit : O(nm)
fonction sommeMatrice(ref M1,M2:tableau[1..n] de tableau [1..m] de rels): tableau[1..n] de tableau [1..m] de rels; var i,j:entier; var M:tableau[1..n] de tableau [1..m] de rels; dbut pour i allant de 1 n faire pour j allant de 1 m faire M[i][j]=M1[i][j]+M2[i][j]; finpour finpour retourner(M) finfonction
Complexit : O(nm)
24
INF102 - 2007
De plus, on considra que l'ordre est croissant. Tri slection Tri insertion et tri bulle Fusion de tableaux tris Tri par dnombrement
1. Tri slection
Ce tri est bas sur l'algorithme de recherche du minimum On adapte cet algorithme pour pouvoir effectuer la recherche dans un sous-tableau. On a le droulement ici
fonction minimumSoustableau(ref T:tableau[1..N] d'entiers, val Imin,Imax:entier):entier; var sauv:entier; dbut sauv=Imin; pour i allant de Imin+1 Imax faire si T[i]<T[sauv] alors sauv=i; finsi finpour retourner(sauv); fin finfonction fonction triSelection(ref T:tableau[1..N] d'entiers):vide; var i,j,indice_cle:entier; dbut pour i allant de 1 N-1 faire indice_cle=minimumSoustableau(T,i,N); echange(T[i],T[indice_cle]); finpour fin finfonction
Proprit 6.1. La complexit de l'algorithme triSelection sur une instance de taille N est O(n2)
Tri insertion
fonction triInsertion(ref T:tableau[1..N] d'entiers):vide; var i,j,cle:entier; dbut pour i allant de 2 N faire cle=T[i]; j=i-1; tant que j>0 et T[j]>cle faire T[j+1]=T[j]; j=j-1;
25
INF102 - 2007
On a le droulement ici Proprit 6.3. La complexit de l'algorithme triInsertion sur une instance de taille N est : au minimum en O(N), au maximum et en moyenne en O(N2). Ide de la dmonstration La boucle pour s'effectue systmatiquement et demandera O(N)oprations. La boucle tant que effectue au minimum 1 opration (cas ou les nombres sont dj tri) et au maximum O(N) . La boucle tant que effectue en moyenne O(N/2) oprations.
Tri bulle
fonction triBulle(ref T:tableau[1..N] d'entiers):vide; var i,j,cle:entier; dbut pour i allant de 1 N-1 faire pour j allant de N i+1 par pas de -1 faire si T[j]<T[j-1] alors echange(T,j,j-1); finsi finpour finpour fin
On a le droulement ici Proprit 6.4. La complexit de l'algorithme triBulle sur une instance de taille N est O(N2).
Complexit : O(n) Attention, cette version ne fonctionne pas toujours. Par exemple, si I1 a dpass N1 et vaut par exemple N1+1, on comparera T1[N1+1] T2[I2] ce qui n'a pas de sens. Il faut donc utiliser un algorithme exact. On a le droulement ici
fonction triHisto(ref T:tableau[1..N] d'entiers):vide; var H:tableau[0..maximum(T)] d'entier; var i,j,k,max: entier; dbut init(H,0); pour i allant de 1 N faire H[T[i]]=H[T[i]]+1; finpour i=1; max:=maximum(T); pour j allant de 0 max faire pour k allant de 1 H[j] faire T[i]=j; i=i+1; finpour finpour fin finfonction
INF102 - 2007
On a le droulement ici
27
INF102 - 2007
Aide
On considre que une nouvelle fonction copie qui copie un tableau dans un autre mme si ils n'ont pas la mme dfinition. L'en-tte de la fonction est :
fonction copie(ref T1:tableau[1..N1] d'lment; ref T2:tableau[1..N2] d'lment; val indiceT1_1,indiceT1_2,indiceT2: entier):vide;
Algorithme de fusion
fonction fusion(ref T1:tableau[D1..N1] d'entier; ref T2:tableau[D2..N2] d'entier ):tableau[1..N1+N2-D1-D2+2] d'entier; var I1,I2,i:entier; var T:tableau[1..N1+N2-D1-D2+2]d'entier; dbut i=1; I1=D1; I2=D2; tant que I1N1 et I2N2 faire si T1[I1]T2[I2] alors T[i]=T1[I1]; I1=I1+1; sinon T[i]=T2[I2]; I2=I2+1; finsi i=i+1 fintantque si I1N1 alors copier(T1,T,I1,N1,i) sinon copier(T2,T,I2,N2,i) finsi retourner(T) fin finfonction
28
INF102 - 2007
29
INF102 - 2007
1. Visibilit
Comme vu au chapitre Codage et structures de contrle,on peut dclarer dans une fonction des variables et des fonctions locales.
fonction NomDeFonction (ListeParamtres):TypeRsultat; //dclarations des variables ou fonctions locales dbut // partie instruction qui contient l'appel retourne fin finFonction
La multi-imbrication possible des fonctions entrane lexistence de problmes de visibilit : entre les variables et entre les fonctions.
30
INF102 - 2007
La fonction P dclare 3 variables locales x, y, z et deux fonctions locales Q et R, La fonction Q dclare 2 variables locales u, y et un paramtre x, La fonction R dclare 3 variables locales z, u et v. On a le droulement ici
2. Rcursivit
La rcursivit consiste remplacer une boucle par un appel la fonction elle-mme. Considrons la suite factorielle, elle est dfinie par : 0!=1 n!=n(n-1)! La fonction peut s'crire simplement
fonction factorielle(val n:entier):entier; dbut si (n==0) retourne(1) sinon retourne(factorielle(n-1)*n) finsi
31
INF102 - 2007
fin finfonction;
On a le droulement ici. On peut dcrire sur le papier les changements et les appels sous la forme suivante :
Plusieurs appels la fonction peuvent tre excuts dans son corps. Soit la suite dite de Fibonacci dfinie par : u0=1 u1=1 un=un-1+un-2 pour n > 2 la fonction s'crit tout aussi simplement
fonction fibo(val n:entier):entier; dbut si (n==0) ou (n==1) alors retourne(1) sinon retourne(fibo(n-1)+fibo(n-2)) finsi fin finfonction;
On a le droulement ici On peut dcrire sur le papier les changements et les appels sous la forme suivante :
32
INF102 - 2007
3. Complexit
Examinons la suite dfinie par u1=1 un=un-1+n pour n > 1 Une fonction permettant le calcul de son nime terme est :
fonction suite(val n:entier):entier; var i,s:entier; dbut s=0; pour i allant de 1 n faire s=s+i; finpour; retourner(s) fin finfonction;
33
INF102 - 2007 La
complexit en nombre d'opration de suite et suiteR est en O(n). On aurait donc tendance prfrer suiteR pour sa lisibilit. Cependant si on examine la complexit en mmoire, suite est en O(1) alors que suiteR est en O(n). La programmation non rcursive est donc plus efficace. L'utilisation de la rcursivit ne doit pas se faire au dtriment de l'efficacit.
4. Exemples
Chaque fois que l'on dsire programmer une fonction rcursive, on doit rpondre aux questions suivantes : Comment le problme au rang n se dduit il de la solution un (des) rang(s) infrieurs ? Quelle est la condition d'arrt de la rcursivit ?
34
INF102 - 2007
1. Dichotomie
La dichotomie fait partie des mthodes dites "diviser pour rgner". Elle consiste pour un objet de taille N excuter un algorithme de faon rduire le problme un objet de taille n/2. On rpte alors l'algorithme de rduction sur ce dernier objet. Ainsi, il suffit de connaitre la rsolution pour un problme de taille faible (typiquement N=1 ou N=2) pour obtenir la totalit de la rsolution. Ce type d'algorithme est souvent implment de manire rcursive. Lorsque cette technique est utilisable, elle conduit un algorithme trs efficace et trs lisible. Il est parfois ncessaire de prtraiter les donnes avant d'appeler la fonction rcursive. La fonction rcursive est alors une fonction locale la fonction d'appel.
2. Exemples
Recherche du zro d'une fonction croissante
Soit g une fonction croissante sur un intervalle [a,b] et telle que f(a)0 et f(b)0. L'algorithme ci-dessous permet de trouver la valeur x de [a,b] telle que f(x)=0 avec une prcision e.
fonction zero(ref g(val n:rel):fonction;val a,b,e:rel):rel; var M:rel; dbut M=g((a+b)/2); si |M|<e alors retourne((a+b)/2) sinon si M>0 alors zero(g,a,(a+b)/2,e) sinon zero(g,(a+b)/2,b,e) finsi finsi fin finfonction
INF102 - 2007
fonction cherche(ref T:tableau[1..N]d'entiers; val e:entier):entier; var d,f:entier; fonction chercheRec(ref T:tableau[1..N]d'entiers; val d,f,e:entier):entier; var m; dbut si f==d alors si T[d]==e alors retourner(f) sinon retourner(NUL) finsi sinon m=partieEntiere((d+f)/2); si T[m]<e alors retourner(chercheRec(T,m+1,f,e)) sinon retourner(chercheRec(T,d,m,e)) finsi finsi fin finfonction dbut d=1; f=N; retourner(chercheRec(T,d,f,e)) fin finfonction
Proprit 8.2. La complexit de la fonction cherche est O(log2(n)). ide de la preuve La complexit de la fonction cherche est donne par la complexit de chercheRec. Soit f(n) le nombre de test effectu par cette fonction. On a f(1)=2. Soit p tel que 2pn 2p+1. On a donc plog2(n) p+1. De plus
et donc f(n)=2*(p+1).
Remarque
L'algorithme de multiplication de deux matrices de dimension nxn s'implmente facilement en O(n3). Strassen a montr qu'en utilisant une mthode diviser pour rgner la multiplication peut s'effectuer en O(nln(7)/ln(2))(courbes).
3. Complexit
Un algorithme diviser pour rgner a la structure suivante : 1. construire une solution lmentaire pour nn0 2. pour rsoudre un problme de taille n>n0, l'algorithme consiste dcomposer le problme en sous-problmes ayant tous la taille n/b (peut-tre approximativement) 3. appliquer l'algorithme tous les sous-problmes 4. construire une solution du problme en composant les solutions des sous-problmes. La complexit en temps de l'algorithme est donc dtermine par une quation de rcurrence de la forme : C(n) = aC(n/b) + d(n)
36
INF102 - 2007 qui aprs rsolution permet de montrer que cette mthode conduit des algorithmes plus efficaces en nombre d'oprations. Cependant, ceci ne doit pas occulter l'aspect mmoire. La complexit en mmoire doit rester d'un ordre raisonnable. (cf rcursivit).
37
INF102 - 2007
Tris rcursifs
Remarque prliminaire On considrera dans tout ce chapitre que l'on manipule des entiers. L'objet du tri est d'ordonner une squence de N entiers. On considrera que ces entiers sont rangs dans un tableau
var T:tableau[1..N] d'entiers;
De plus, on considra que l'ordre est croissant. Tri fusion Tri rapide
1. Tri fusion
Cet algorithme consiste diviser la squence d'entiers en deux sous-squences, les trier de manire rcursive, puis fusionner les deux sous-squences tries. On utilise la fonction fusion vue au chapitre tris non rcursifs
fonction triFusion(ref T:tableau[1..N]d'entiers):vide; var d,f:entier; fonction fusionLocal(ref T:tableau[1..N] d'entier; val d,m,f:entier):vide; var C:tableau[1..f-d+1]d'entier; dbut C:=fusion(T,T,d,m,m+1,f); copie(C,T,d,f,d); fin finfonction fonction triFusionRec(ref T:tableau[1..N]d'entiers; val d,f:entier):vide; dbut si d<f alors m=partieEntiere((d+f)/2); triFusionRec(T,d,m); triFusionRec(T,m+1,f); fusionLocal(T,d,m,f); finsi fin finfonction dbut trifusionRec(T,1,N) fin finfonction
On a le droulement ici Proprit 9.1. La complexit du tri fusion pour une squence de n lments est O(nlog2(n)). ide de la preuve La complexit de la fonction triFusion est donne par la complexit de triFusionRec. Soit f(n) le nombre de test effectu par cette fonction. On a f(1)=0. Soit p tel que 2pn 2p+1. On a donc plog2(n) p+1. On en dduit
38
et
INF102 - 2007
2. Tri rapide
Cet algorithme consiste utiliser une valeur x de la squence pour diviser la squence d'entiers en deux sous-squences: l'ensemble des valeurs infrieures ou gales x l'ensemble des valeurs suprieures x. Puis la procdure s'effectue rcursivement sur les deux sous squences.
fonction triRapide(ref T:tableau[1..N]d'entiers):vide; fonction diviserSequence(ref T:tableau[1..N] d'entier; val d,f:entier):entier; var x,i:entier; dbut x=T[f]; i=d-1; pour j allant de d f-1 faire si T[j]x alors i=i+1; echanger(T,i,j); finsi finpour echanger(T,i+1,f); retourner(i+1); fin finfonction fonction triRapideRec(ref T:tableau[1..N]d'entiers; val d,f:entier):vide; var p:entier; dbut si d<f alors p=diviserSequence(T,d,f); triRapideRec(T,d,p-1); triRapideRec(T,p+1,f); finsi fin finfonction dbut triRapideRec(T,1,N) fin finfonction
On a le droulement ici Proprit 9.2. La complexit du tri rapide pour une squence de n lments est au maximum en O(n2), en moyenne et au minimum en O(nlog(n)).
39
INF102 - 2007
1. Enonc
Dcrire une structure permettant de grer des polynmes dfinis sur les rels. Ecrire un ensemble de primitives associes permettant les principales oprations.
2. Structure et primitives
On note n le degr (resp. le degr maximum) du plynome (resp. des plynomes).
Structure
Un plynome peut tre dfini par son degr et un tableau contenant les coefficients. On dfinit galement une primitive d'initialisation.
constante Taille=200; type polynome=structure coeff:tableau[0..200]de rls; degre: entier; finstructure fonction init(ref p:polynome):vide; var i:entier; dbut p.degre=0; pour i allant de 0 Taille faire p.coeff[i]=0; finpour fin finfonction
Addition
On notera l'analogie avec l'algorithme de fusion de tableau.
fonction ajoute(ref p1,p2:polynome):polynome; var p:polynome; var m,i:entier; dbut m=min(p1.degre,p2.degre); pour i de 0 m faire p.coeff[i]=p1.coeff[i]+p2.coeff[i] finpour; si m<p1.degre alors pour i de m+1 to p1[degre] do p.coeff][i]=p1.coeff][i]; finpour: p.degre=p1.degre; sinon
40
pour i de m+1 to p2[degre] do p.coeff[i]=p2.coeff[i]; finpour: p.degre=p2.degre; finsi retourner(p); fin; finfonction;
INF102 - 2007
Complexit : O(n)
Multiplication
fonction multiplie(ref p1,p2:polynome):polynome; var p:polynome; var i,j:entier; dbut init(p); p.degre=p1.degre+p2.degre; pour i de 0 p1.degre; pour j de 0 p2.degre faire p.coeff[i+j]=p.coeff[i+j]+p1.coeff[i]*p2.coeff[j]; finpour finpour retourner(p); fin finfonction
Complexit : O(n2)
Polynome oppos
Soit
.
fonction moins(ref p:polynome):polynome; var i:entier; var m:polynome; dbut m.degre=p.degre; pour i de 0 a p.degre faire m.coeff[i]=-p.coeff[i]; finpour retourner(m) fin finfonction
Complexit : O(n)
Multiplication par xn
fonction decale(ref p:polynome;val n:entier):polynome var i:entier; var d:polynome; dbut d.degre=p.degre+n; si n>0 then pour i de 0 a n-1 FAIRE
41
INF102 - 2007
d.coeff[i]=0; finpour pour i de 0 a p.degre faire d.coeff[i+n]=p.coeff[i]; finpour sinon pour i de -n a p.degre faire d.coeff[i+n]=p.coeff[i]; finpour finsi retourner(d) fin finfonction
Complexit : O(n)
Derive
fonction deriv(ref p1:polynome):polynome; var p:polynome; var i:entier; dbut si p1.degre==0 alors p.degre=0; p.coeff[0)=0; sinon p.degre=p1.degre-1; pour i de 1 p1.degre faire p.coeff[i-1]=p1.coeff[i] finpour; finsi; retourner(p) fin finfonction
Complexit : O(n)
Valeur en un point
fonction valeur(ref p:polynome;val x: rl):rl; var f,s,i:rel; dbut s=0; f=1; pour i allant de 0 p.degre faire s=s+f*p.coeff[i]; f=f*x finpour retourner(s) fin finfonction
Complexit : O(n)
Intgrale dfinie
fonction integraleDefinie(ref p1:polynome;val x,y: rl):rl; var p:polynome; var s:rel; var i:entier; dbut p.degre=p1.degre+1; p.coeff[0]=0; pour i allant de 0 p1.degre faire p.coeff[i+1]=p1.coeff[i]/(i+1); finpour; retourner(valeur(p,y)-valeur(p,x)) fin
42
finfonction
INF102 - 2007
3. Amlioration de la complexit
Mme si en premire approche, la complexit ne prend en compte le nombre d'oprations (+, *), en seconde analyse, les multiplications sont beaucoup plus coteuses que les additions. Ceci est pris en compte dans les algorithmes ci-dessous.
Valeur en un point
L'algorithme nonc au paragraphe prcdent effectue 2n multiplications. Le schma d'Horner d'un plynome permet d'effectuer n multiplication seulement. Le schma d'Horner repose sur la proprit suivante : Soit P(X) un plynome de suprieur 0,
.
fonction valeur(ref p:polynome;val x: rl):rl; var s:rel; dbut s=p.coeff[p.degre]; pour i allant de p.degre-1 0 pas de -1 faire s=s*x+p.coeff[i] finpour retourner(s) fin finfonction
4. Multiplication
Une mthode diviser pour rgner permet d'amliorer cet algorithme. Elle est base sur l'galit suivante
. Cette galit signifie, entre autre, que si deux plynomes sont de degr 1, il suffit de trois multiplications de rels pour obtenir leur produit. Les quantits a, b, c, d, y tant quelconque, celles-ci peuvent tre elles mmes des polynmes. Soit le plynome
INF102 - 2007
avec
. De mme on a :
, ,
. On peut donc utiliser l'quation du dpart avec a=A(x), b=B(x), c=C(x), d=D(x) et . De plus, on est amen calculer des produits de plynomes de degr au plus n/2. Il s'agit donc d'une mthode diviser pour rgner. La complexit en nombre de multiplications est alors O(nlog23). Comme on notera ci-dessous l'algorithme est plus complexe crire mais il est bien plus efficace aussi. Un prtraitement permet de considrer des plynomes de mme degr. Il faut donc une fonction "chapeau". On dfinit de plus deux autres fonctions utiles pour le calcul : etend : si le degr de P(x) est suprieur au degr de Q(x), alors Q(x) est modifi de manire ce que les coefficients manquant soient zro, et les degrs des deux plynomes deviennent ainsi gaux. tronque : permet d'initialiser un plynome avec les premiers termes d'un autre plynome (calcul de B(x) et D(x)).
fonction multiplie(ref p,q:polynome):polynome; var p1,p2:polynome; fonction etend(ref p:polynome;val n:entier):polynome; var i:entier; var r:polynome; dbut r=decale(p,0); r.degre=n; pour i de p.degre+1 a n faire r.coeff[i]=0; finpour; retourner(r); fin finfonction fonction tronque(ref p:polynome;val n:entier) var c:polynome; var i:entier; dbut c.degre=n; pour i de 0 a n faire
44
c.coeff[i]=p.coeff[i]; INF102 - 2007 finpour; retourner(c); fin finfonction fonction multirec(ref p,q:polynome) var a,b,c,d:polynome; var c0,c1,c2:rel; var C0,C1,C2:rel; var m:entier; dbut selon que cas p.degre==0 retourner(polynome([p.coeff[0]*q.coeff[0]])) cas p.degre==1 c0= p.coeff[0]*q.coeff[0]; c2=p.coeff[1]*q.coeff[1]; c1= (p.coeff[0]+p.coeff[1])*(q.coeff[0]+q.coeff[1]); c1=c1-c0-c2; retourner(polynome([c0,c1,c2])); autrement m=partieEntire(p.degre/2); a=decale(p,-(m+1)); b=tronque(p,m); c=decale(q,-(m+1)); d=tronque(q,m); C2=multirec(a,c); C0=multirec(b,d); C1=multirec(ajout(a,b),ajout(c,d)); C1=ajout(c1,ajout(moins(c0),moins(c2))); C1=decale(c1,1+m); C2=decale(c2,2+2*m); C0=ajout(c0,ajout(c1,c2)); retourner(C0); finselonque: fin finfonction; dbut si p.degre>q.degre alors p1=p; p2=etend(q,p.degre); sinon p1=q; p2=etend(p,q.degre); finsi; retourner(multirec(p1,p2)); fin finfonction
45
INF102 - 2007
Listes
Dfinition Liste simplement chaine Liste doublement chaine Quelques exemples d'algorithmes
1. Dfinition
Dfinition 6.1. Une liste est une table d'association cl unique telle que le nombre d'lments de la table ( dimension ou taille) est variable, l'accs aux lments s'effectue indirectement par le contenu de la cl qui le localise appele pointeur. La complexit de l'accs un lment par son pointeur est O(1). Si p est un pointeur vers un lment alors contenu(p) est l'lment lui-mme. Un pointeur qui n'adresse aucun lment a pour valeur NIL. On crit en EXALGO pour dclarer un pointeur
nom_pointeur=^type_predefini;
La manipulation des lments de la liste dpend des fonctions dfinies comme s'excutant en temps O(1).
modification
fonction crer liste(ref L:type_liste):vide; fonction insrerAprs(val x:type_prdfini; ref L:type_liste; P:^type_predefini):vide; fonction insrerEnTete(val x:type_prdfini; ref L:type_liste):vide; fonction supprimerAprs(ref L:type_liste;val P:^type_predefini) fonction supprimerEnTete(ref L:type_liste):vide;
On crira en EXALGO listeSC pour prciser qu'il s'agit d'une liste simplement chaine.
46
fonction estDernier(ref L:listeSC de type_prdfini; ref P:^type_prdfini):boolen; dbut retourner(suivant(L,P)=NIL) fin finfonction
INF102 - 2007
Complexit: O(n).
On crira en EXALGO listeDC pour prciser qu'il s'agit d'une liste doublement chaine.
47
INF102 - 2007
Supprimer un lment
fonction supprimer(ref L:listeDC de type_predefini; val e: type_prdfini):boolen; var p,prec,suiv:^type_prdfini; dbut p=chercher(L,e); si p==NIL alors retourner(FAUX) sinon si estPremier(L,p) alors supprimerEnTete(L) sinon prec=prcdent(L,p); supprimerApres(L,prec); finsi retourner(VRAI) finsi fin finfonction
4. Quelques algorithmes
Taille
fonction taille(val L:type_liste):entier; var p:^type_prdfini; var t:entier; dbut si listeVide(L) alors retourner(0) sinon retourner(1+taille(suivant(L,premier(L)))) finsi fin finfonction
Complexit: O(n).
INF102 - 2007
1. Qu'est-ce qu'implmenter
Pour certaines structures de donnes, l'ensemble des langages de programmation proposent une traduction immdiate. Pour d'autres, il n'existe pas de traduction immdiate. Il faut alors dfinir explicitement l'algoritme de chacune des primitives. Exemple - les listes. On doit dfinir le stockage de la liste, et en fonction de ce stockage comme s'effectue par exemple l'adjonction. L'implmentation doit respecter la complexit des primitives part celle d'initialisation (celle-ci ne s'excutera qu'une fois). Exemple - les listes. On utilise souvent les fonctions ajouter et supprimer mais une seule fois creerListe.
2. Choix de la structure
Ici nous allons choisir de ranger les lments dans un tableau "suffisament grand". Chaque lment du tableau est une paire (valeurElement,pointeurSuivant). Un pointeur est la valeur d'un index du tableau ainsi l'accs au suivant est en complexit O(1). La zone de stockage peut donc tre dcrite par :
elementListe=structure valeur:car; suivant:entier; finstructure; stockListe=tableau[1..tailleStock] d'elementListe;
La valeur du pointeur (champs suivant) est donc un entier compris entre 0 et tailleStock. La valeur 0 correspondant l'absence d'lment suivant. Le premier lment doit tre accessible en O(1), il faut donc conserver son index. Si la liste est vide, par convention, l'index du premier sera 0. On peut donc reprsenter une liste par la structure suivante :
listeSC_Car=structure tailleStock:entier; premier:entier; vListe:stockListe; finstructure;
Le tableau de stockage tant grand mais pas illimit, il faudra prvoir que la l'espace de stockage puisse tre satur.
49
INF102 - 2007
3. Primitives d'accs
Ces fonctions sont immdiates.
fonction premier(val L:listeSC_Car):entier; dbut retourner L.premier; fin; finfonction fonction suivant(val L:listeSC_Car,P:entier):entier; dbut retourner L.vListe[P].suivant; fin finfonction fonction listeVide(val L:listeSC_Car):boolen; dbut retourner L.premier==0; fin finfonction
Par convention, l'espace de stockage sera satur lorsque l'index premierLibre vaut 0 (la liste des cellules libres est vide). On dfinit donc la fonction de test :
fonction listeLibreVide(val L:listeSC_Car):boolen; dbut retourner L.premierLibre==0; fin finfonction
On dfinit deux primitives lies la gestion du stockage : mettreCellule : met une cellule en tete d'une liste, prendreCellule : supprime la cellule de tete d'une liste. Les oprations sont respectivement de type insererEnTete et supprimerEnTete. Prciser la liste sur laquelle s'effectue l'opration revient prciser le pointeur de tte surlequel on travaille.
fonction prendreCellule(ref L:listeSC_Car,ref tete:entier):entier; var nouv:entier; dbut nouv=tete; tete=suivant(L,nouv); retourner nouv; fin finfonction fonction mettreCellule(ref L:listeSC_Car,val P:entier,ref tete:entier):vide; dbut
50
INF102 - 2007
5. Primitives de modifications
fonction crer_liste(ref L:listeSC_Car;val tailleMax:entier):vide; var i:entier; dbut L.tailleStock=tailleMax; L.premier=0; L.premierLibre=1; pour i allant de 1 L.tailleStock-1 faire L.vListe[i].suivant=i+1; finpour L.vListe[tailleStock].suivant=0; fin finfonction fonction insrerAprs(val x:car; ref L:listeSC_Car; val P:entier):bool; var nouv:entier; dbut si listeLibreVide(L) ou P==0 alors retourner faux; sinon nouv=prendreCellule(L,L.premierLibre); L.vListe[nouv].valeur=x; L.vListe[nouv].suivant=suivant(L,P); L.vListe[P].suivant=nouv; retourner vrai; finsi fin finfonction fonction insrerEnTete(val x:car;ref L:listeSC_Car):bool; var nouv:entier; dbut si listeLibreVide(L) alors retourner faux; sinon nouv=prendreCellule(L,L.premierLibre); L.vListe[nouv].valeur=x; mettreCellule(L,nouv,L.premier); retourner vrai; finsi fin finfonction fonction supprimerAprs(ref L:listeSC_Car;val P:entier):bool; var suivP:entier; dbut suivP=suivant(L,P); si P==0 ou suivP==0 alors retourner faux; sinon L.vListe[P].suivant=suivant(L,suivP); mettreCellule(L,suivP,L.premierLibre); retourner vrai; findi fin finfonction fonction supprimerEnTete(ref L:listeSC_Car):bool; var tete:entier; dbut si listeVide(L) alors retourner faux; sinon tete=L.premier; L.premier=suivant(L,tete); mettreCellule(L,tete,L.premierLibre);
51
INF102 - 2007
52