Algorithmique_Club de programmation
Algorithmique_Club de programmation
Algorithmique_Club de programmation
L ANGAGE
16
ET COMPLEXITÉ
16.1 P OURQUOI UN AUTRE LANGAGE ?
L’informatique comprend de nombreux langages de programmation (C, C++, Java,
Caml, Fortran, Pascal, Lisp, Prolog, Cobol, etc.). Programmer dans tous ces langage
requiert une connaissance de base qui est indé pendante du langage de programma-
tion : l’algorithmique. Pour cela, on doit distinguer les algorithmes, qui sont des
méthodes applicables par des ordinateurs pour ré soudre diffé rents problè mes, de leur
implé mentation dans tel ou tel langage particulier.
Nous é tudions dans ce chapitre un langage algorithmique qui n’est pas un langage
de programmation. Ce langage n’est pas trè s é loigné conceptuellement du langage C
é tudié jusqu’à maintenant, mais il permet tout de mê me de concevoir les algorithmes
indé pendamment de leur implé mentation en C.
16.2 T YPES
Les types de base du langage sont :
• entier : c’est le type nombre entier, correspondant au type int du C, sauf qu’il
n’est pas nécessairement codé sur 4 octets.
• reel : c’est le type nombre réel, pouvant correspondre avec les types double ou
float du C.
• caractere : c’est le type caractè re, correspondant au type char du C. Pour un tel
caractere c, la fonction ASCII(c) donnera le code ASCII de c.
157
Chapitre 16 • Langage algorithmique et complexité
Fichier f;
f ← ouvrir("nom.txt", "lect");
Les modes d’ouverture de fichiers peuvent ê tre "lect" (lecture seule), "ecr"
(é criture seule), ou bien le mode lecture-é criture "lectEcr".
La fonction lireF permet de lire une variable dans un fichier. Si x est de type
entier, ré el, caractè re ou chaîne de caractè res, et f un fichier ouvert en lecture, l’ins-
truction :
lireF(x, f);
met dans x la première valeur lue dans le fichier (et avance la position courante
dans le fichier).
La fonction ecrireF permet d’é crire une variable dans un fichier texte. Si x est de
type entier, ré el, caractè re ou chaîne de caractè res, et f un fichier ouvert en é criture,
l’instruction :
ecrireF(x, f);
permet d’é crire la valeur de x dans le fichier (et avance la position courante dans le
fichier).
16.4 S YNTAXE
L’affectation est noté e ←, le test d’égalité est noté =.
Exemple 1
L’algorithme suivant calcule et affiche 2n , où n est saisi au clavier.
Algorithme
début
entier i, n, puiss;
puiss ← 1;
lire(n);
pour i ← 0 à n-1 pas 1 faire
puiss ← puiss * 2;
fin faire
ecrire(puiss);
fin
158
16.5. Fonctions et procédures
Exemple 2
Voici une version interactive de l’algorithme précédent :
Algorithme
début
entier i, n, puiss;
caractere choix;
ecrire("Voulez-vous calculer une puissance de 2 ? ")
lire(choix);
si choix = ’y’ faire
puiss ← 1;
i ← 0;
lire(n);
tant que i<n faire
puiss ← puiss * 2;
i ← i+1
fin faire
ecrire(puiss);
fin faire
fin
où :
• TypeRetour est le type de la valeur retourné e par la fonction ;
• NomFonction est le nom de la fonction ;
• Type1, Type2... sont les types respectifs des paramè tres ;
• nom1, nom2... sont les identificateurs respectifs des paramè tres.
© Dunod. La photocopie non autorisé e est un dé lit.
Exemple 3
L’algorithme ci-dessus calculant 2n peut être restructuré à l’aide d’une fonction :
159
Chapitre 16 • Langage algorithmique et complexité
retourner puiss;
fin
Algorithme
début
entier n, puiss;
lire(n);
puiss ← DeuxPuiss(n);
ecrire(puiss);
fin
16.5.2 Procédures
Une procé dure est similaire à une fonction, mais elle ne retourne aucune valeur. Une
procé dure aura un prototype de la forme :
Exemple 4
Dans l’ exemple suivant, la procédure Affiche permet l’ affichage d’une donnée de
type entier.
FONCTION DeuxPuiss(entier n): entier
début
entier i, puiss;
puiss ← 1;
pour i ← 0 à n-1 pas 1 faire
puiss ← puiss * 2;
fin faire
retourner puiss;
fin
PROCEDURE Affiche(entier a)
début
ecrire("l’entier vaut : ");
ecrire(a);
fin
Algorithme
début
entier n, puiss;
lire(n);
puiss ← DeuxPuiss(n);
Affiche(puiss);
fin
160
16.6. Enregistrements
16.6 E NREGISTREMENTS
Un enregistrement correspond à une structure C.
Exemple 5
enregistrement TypeArticle
début
entier code;
caractere nom[100];
reel prix;
fin
PROCEDURE Affiche(TypeArticle A)
début
ecrire(A.code);
ecrire(A.nom);
ecrire(A.prix);
fin
Algorithme
début
TypeArticle A;
ecrire("Entrez le code, le nom et le prix");
lire(A.code, A.nom, A.prix);
Affiche(A);
fin
entier n;
entier *p;
n ← 2;
p ← &n;
© Dunod. La photocopie non autorisé e est un dé lit.
*p ← *p+1;
ecrire(n); /* affiche 3 */
La diffé rence avec le C se situe au niveau des fonctions d’allocation. L’opé rateur
nouveau permet d’allouer de la mémoire en langage algorithmique.
Exemple 6
enregistrement TypeArticle
début
entier code;
161
Chapitre 16 • Langage algorithmique et complexité
caractere nom[100];
reel prix;
fin
162
16.8. Notion de complexité d’un algorithme
tions é lé mentaires engendrées par l’appel de cette fonction ou procé dure. Le temps
de calcul pris par l’algorithme (sur une machine donné e) est directement lié à ce
nombre d’opé rations.
En fait, il est hors de question de calculer exactement le nombre d’opé rations en-
gendré es par l’application d’un algorithme. On cherche seulement un ordre de gran-
deur (voir figure 16.1). L’ordre de grandeur asymptotique est l’ordre de grandeur
lorsque la taille des donné es devient trè s grande.
O(2 n)
nombre d’opérations
O(n 3)
)
O (n 2
n )
og
nl
O(
)
O (n
zone √
O ( n)
transitoire O(log n)
O(1)
n
Figure 16.1– Ordres de grandeurs asymptotiques
NB(d, n) ≤ K.n
NB(d, n) ≤ K.n2
163
Chapitre 16 • Langage algorithmique et complexité
NB(d, n) ≤ K.2n
Exercices
16.1 (∗) É crire un algorithme qui initialise un tableau de n entiers, le nombre n é tant
saisi au clavier, la valeur d’indice i du tableau valant 1 si 3i2 + i − 2 est multiple de 5
et 0 sinon.
16.2 (∗) É crire une fonction en langage algorithmique qui prend en paramè tre un
entier i et calcule la valeur u(i) dé finie par récurrence par :
u0 = 1 ; u1 = 2
16.3 (∗) É crire une fonction en langage algorithmique qui saisit les éléments d’un
tableau dont le nombre d’é lé ments n est passé en paramè tre. On supposera que le
tableau a déjà é té alloué et est passé en paramè tre.
16.4 (∗) É crire une fonction en langage algorithmique qui prend en paramè tre un
entier n et un tableau à deux dimensions de taille n × n d’entiers. La fonction calcule
la somme des é lé ments du tableau.
16.5 (∗∗) É crire une fonction en langage algorithmique qui calcule les valeurs d’un
tableau T de taille n, le nombre n é tant saisi au clavier, dont les valeurs T [i] sont
telles que T [0] = 1 et pour i ≥ 1 :
164
Exercices
a) É crire une fonction en langage algorithmique qui prend en paramè tre un entier x
et calcule f (x).
b) É crire une fonction en langage algorithmique qui prend en paramè tre un entier n
et calcule la somme :
S n = f (n) + f (n − 1) + f (n − 2) + f (n − 3) + f (n − 4) + · · ·
On arrê tera la somme lorsque la valeur f calculé e est nulle.
c) É crire une fonction en langage algorithmique qui prend en paramè tre un entier n
et calcule la somme :
Dans cette somme, les divisions sont des divisions euclidiennes. On arrê tera la
somme lorsque la valeur f calculé e est nulle.
d) É crire une fonction en langage algorithmique qui prend en paramè tre un entier n
et calcule la somme :
quer une mé thode qui né cessite moins d’opé ration. La mé thode s’appelle la recherche
dichotomique.
À chaque é tape, on recherche un é lé ment é gal à a entre deux indices imin et imax . Au
dé part, l’élément peut se trouver n’importe où (entre imin = 0 et imax = n − 1).
On compare l’é lé ment d’indice i = (imin + imax )/2 avec a. Trois cas peuvent se pro-
duire :
165
Chapitre 16 • Langage algorithmique et complexité
• Si l’é lé ment d’indice i est supé rieur à a, un é lé ment é gal à a ne peut se trouver qu’à
un indice plus petit que i, puisque le tableau est trié. Le nouvel imax vaut i − 1.
• Si l’é lé ment d’indice i est inférieur à a, un é lément é gal à a ne peut se trouver qu’à
un indice plus grand que i. Le nouvel imin vaut i + 1.
Á chaque é tape, un élé ment é gal à a ne peut se trouver qu’entre imin et imax . On itè re
ce procé dé jusqu’à ce que imin devienne strictement supé rieur à imax . Il ne reste plus
qu’à tester un seul é lé ment.
Comme à chaque é tape le nombre d’é léments est divisé par 2, le nombre k d’étapes
n
est tel que k ≥ 1. Donc k ≤ log2 (n).
2
a) É crire une de recherche dichotomique d’un nombre x dans un tableau de n
nombres. La fonction renvoie 1 si l’élément se trouve dans le tableau et 0 sinon.
Corrigés
16.1
Algorithme
début
entier i, n, puiss;
entier *tab;
lire(n);
tab ← nouveau entier[n];
pour i ← 0 à n-1 pas 1 faire
si (3*i*i+i-2)%5 = 0 faire
tab[i] ← 1;
sinon faire
tab[i] ← 0;
fin faire
fin
166
Corrigés
16.2
FONCTION Calculu(entier i): entier
début
entier j;
entier U0, U1, U2;
U0 ← 1;
U1 ← 2;
si i=0 faire
retourner U0;
fin faire
si i=1 faire
retourner U1;
fin faire
j ← 2;
tant que j<=i faire
U2 ← 3 * U1-U0;
U0 ← U1;
U1 ← U2;
j ← j+1;
fin faire
retourner U2;
fin
La complexité est de O(i)
16.3
PROCEDURE Saisit(entier n, entier *tab)
début
entier i;
pour i ← 0 à n-1 pas 1 faire
lire (tab[i]);
fin faire
fin
© Dunod. La photocopie non autorisé e est un dé lit.
16.4
FONCTION Somme(entier n,entier **tab): entier
début
entier i, j;
entier somme ← 0;
pour i ← 0 à n-1 pas 1 faire
pour j ← 0 à n-1 pas 1 faire
167
Chapitre 16 • Langage algorithmique et complexité
16.5
FONCTION CalculerT(entier *nb): entier *
début
entier n, i;
entier *tab;
lire(n);
*nb ← n;
tab ← nouveau entier[n];
tab[0] ← 1;
pour i ← 0 à n-1 pas 1 faire
tab[i] ← 0;
pour j ← 0 à i-1 pas 1 faire
tab[i] ← tab[i] + tab[j];
fin faire
tab[i] ← tab[i]*i;
fin faire
retourner tab;
fin
La complexité est de O(n2 )
16.6
a)
FONCTION CalculerFx(entier x): entier
début
si x<1 faire
retourner 0;
fin faire
retourner 3*x*x+x+1;
fin
La complexité est de O(1)
b)
FONCTION CalculerSn(entier n): entier
début
entier j ← n;
168
Corrigés
entier S ← 0;
tant que j>0 faire
S ← S + CalculerFx(j);
j ← j-1;
fin faire
retourner S;
fin
La complexité est de O(n)
c)
FONCTION CalculerTn(entier n): entier
début
entier i, j, Fx;
entier T ← 0;
i ← n;
j ← 2;
Fx ← CalculerFx(i);
tant que Fx !=0 faire
T ← T + Fx;
i ← n/(j*j);
j ← j+1;
Fx ← CalculerFx(i);
fin faire
retourner T;
fin
√
La complexité est de O( n)
d)
FONCTION CalculerUn(entier n): entier
début
entier i, j, Fx;
entier U ← 0;
i ← n;
j ← 1;
© Dunod. La photocopie non autorisé e est un dé lit.
Fx ← CalculerFx(i);
tant que Fx !=0 faire
U ← U + Fx;
j ← j * 2;
i ← n/j;
Fx ← CalculerFx(i);
fin faire
retourner U;
fin
La complexité est de O(log2 (n))
169
Chapitre 16 • Langage algorithmique et complexité
16.7
a)
FONCTION Recherchedicho(entier a, entier *tab, entier n): entier
début
entier debut ← 0, fin ← n-1, milieu;
tant que debut <=fin faire
milieu ← (debut+fin)/2;
si a= tab[milieu] faire
retourner 1;
si a < tab[milieu] faire
fin=milieu-1;
sinon faire
debut=milieu + 1;
fin faire
retourner 0;
fin
b) La complexité est de O(log2 (n))
170