




























































































Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Ce document parle des algorithmes de façon très simple
Typology: Lecture notes
1 / 217
This page cannot be seen from the preview
Don't miss anything!





























































































emea l’algorithme et son impl´ementationeme 0 / 1 -Knapsack (Sac-a-dos 0 / 1 )a la programmation dynamique: Le probleme du sac `a dos8.7 Quelques autres problemes de graphe NP-complets.................................... 210 8.8 Probl`emes de th´eorie des ensembles........................ 211
Algorithme 1 M´ethode na¨ıve de sommation Input: Un entier positif n ∈ N. Output: La somme s :=
∑n k=1 k. s ← 0 for i = 1 to n do s ← s + i end for return s
Une meilleure m´ethode a ´et´e d´ecouverte par le math´ematicien allemand Carl Friedrich Gauß a l’ˆage de 5 ans. Son instituteur, pour le punir, lui demanda de calculer la somme des entiers de 1a 100. Le jeune Gauß annonca le r´esultat tres peu de temps apres, car il avait r´ealis´e qu’on pouvait ajouter les termes deux par deux en partant des cˆot´es oppos´es de la liste, et que les termes interm´ediaires ainsi obtenus ´etaient tous identiques: 1 + 100 = 101, 2 + 99 = 101,... , 50 + 51 =
Cette m´ethode peut ˆetre g´en´eralis´ee `a tout n pair. On a:
n 2
termes
1 + n = n + 1 2 + n − 1 = n + 1 3 + n − 2 = n + 1 .. .
n 2 −^1 +^
n n^2 + 2^ =^ n^ + 1 2 +^
n 2 + 1^ =^ n^ + 1
Donc,
S(n) =
n(n + 1) 2
L’impl´ementation de la m´ethode de Gauß est triviale; Il suffit d’´ecrire la formule ci-dessus:
Algorithme 2 M´ethode de sommation de Gauß Input: Un entier positif n ∈ N. Output: La somme s :=
∑n k=1 k. return n(n 2 +1)
Nous avons d´eclar´e que la m´ethode de Gauß ´etait meilleure que notre m´ethode originale. Mais que veut dire “meilleure”? Nous pouvons donner un sens pr´ecis a ce terme: nous voulions dire qu’en utilisant la m´ethode de Gauß, la somme pouvait ˆetre calcul´ee de fac¸on plus efficace. Ceci peut ˆetre montr´e formellement en comparant le nombre d’op´erations arithm´etiques dont a besoin chaque algorithme pour parvenir au r´esultat.
La premiere m´ethode utilise n additions du compteur s. (Nous ignorons les additions de i). La deuxieme m´ethode utilise 3 op´erations arithm´etiques (une addition, une multiplication et une division). La m´ethode de Gauß est donc plus performante pour n > 3.
Il nous manque toujours:
0.2.2 Probl`eme de Localisation
Probleme: Probleme de localisation Input: Des entiers a 0 < a 1 < · · · < an− 1 , et x ∈ Z Output: Trouver un indice i tel que ai = x, si un tel i existe
Exemple: Supposons que les entiers soient 1 , 3 , 8 , 11 , 39 , 41 ; Si x = 39, l’output de l’algorithme serait 4 , alors que si x = 26 il n’y aurait pas de r´eponse.
Voici une premiere solution au probleme:
Algorithme 3 Recherche lin´eaire i ← 0 while ai 6 = x and i < n do i ← i + 1 end while if i = n then return ERROR else return i end if
Quelle est l’efficacit´e de cette solution? Comme avant, nous comptons le nombre d’op´erations arithm´etiques que doit r´ealiser l’algorithme. Nous ignorons de nouveau les op´erations qui ne concernent que le compteur i. Les op´erations restantes sont donc les comparaisons ai 6 = x. Cet algorithme effectue n comparaisons dans le pire des cas (ici le pire des cas se produit quand x n’est pas dans la liste ou quand x est le dernier ´el´ement, x = an− 1 ).
Peut-on faire mieux? Oui, car on peut utiliser le fait que les ai sont ordonn´es. C’est ce que fait l’algorithme suivant, appel´e Recherche Binaire ( Binary Search ):
0.2.3 Monnaie Optimale
**Probleme: Monnaie optimale Input:** Une collection C = { 1 , 2 , 5 , 10 , 20 , 50 , 100 } de valeurs de pieces de monnaie, et un entier x Output: Une suite finie de pieces, contenant aussi peu de pieces que pos- sible, dont la somme des valeurs vaut x
Exemple: Si x = 325, alors
c 0 = c 1 = c 2 = 100, c 3 = 20, c 4 = 5.
Nous pouvons donc obtenir le r´esultat demand´e en utilisant 5 pi`eces.
Voici l’algorithme le plus simple qui vienne `a l’esprit, appel´e Algorithme Glouton ( Greedy Algorithm ):
Algorithme 5 Algorithme Glouton v ← 0 et t ← 0 while v < x do Trouver le plus grand c ∈ C tel que c + v ≤ x ct ← c v ← v + c t ← t + 1 end while return (c 0 , c 1 ,... , ct− 1 )
Cet algorithme retourne-t-il une suite de pieces dont la somme des valeurs vaut x? Si oui, le nombre de pieces est-il minimal?
Il nous manque toujours:
Le premier pas vers ces objectifs est d’avoir une maniere rigoureuse de d´ecrire ce que l’algorithme doit accomplir, c’est-a-dire une sp´ecification formelle du probl`eme. Ceci n´ecessite quelques concepts math´ematiques (ensembles, relations, fonctions,... ) que nous d´ecrirons dans les prochaines sections.
0.3 TH´EORIE DES ENSEMBLES
Nous supposons que la notion d’ensemble est connue. En g´en´eral, nous noterons les ensembles par des lettres majuscules A, B, etc. Les mots “famille” et “collection” seront pour nous des synonymes de “ensemble”.
0.3.1 Rappels de notations de logique
Rappelons les symboles suivants:
∀ pour tout ∃ il existe ∧ et ∨ ou =⇒ implique ∈ appartient `a
Exemple: L’expression ∀x ∈ A : x 6 = y =⇒ x > y ∨ x < y,
est lue comme suit:
Pour tout x appartenant `a A, si x est distinct de y, alors x est strictement plus grand que y ou x est strictement plus petit que y.
Rappelons aussi que les versions barr´ees 6 ∃, /∈, etc... d´enotent les oppos´es des symboles correspondants (c’est-a-dire, “x /∈ A” veut dire que “x n’appartient pasa A”).
Remarque:
D´efinition. L’union, l’intersection, la diff´erence et le produit cart´esien d’ensembles peuvent ˆetre d´efinis comme suit:
A ∪ B := {x | x ∈ A ∨ x ∈ B}.
Plus g´en´eralement, si F est un ensemble de sous-ensembles d’un ensemble X, l’union de tous les membres de F est d´efinie comme suit: ⋃
A∈F
A := {x ∈ X | ∃A ∈ F : x ∈ A}
A ∩ B := {x | x ∈ A ∧ x ∈ B}.
De mani`ere plus g´en´erale, pour une famille F de sous-ensembles de X, l’intersection de tous les membres de X est l’ensemble ⋂
A∈F
A := {x ∈ X | ∀A ∈ F : x ∈ A}.
A \ B := {x ∈ A | x /∈ B}.
A∆B = (A \ B) ∪ (B \ A).
(a 1 ,... , an) o`u a 1 ∈ A 1 ,... , an ∈ An.
Le n-`eme produit cart´esien de A est l’ensemble
An^ := A︸ × · · · ×︷︷ A︸ n fois
Remarque: Les op´erateurs ∪ et ∨, respectivement ∩ et ∧, ne sont pas seulement superficielle- ment similaires. En fait, la d´efinition de ∪ fait appel a ∨ et celle de ∩ a ∧.
D´efinition. A tout ensemble A nous pouvons associer une quantit´e appel´ee sa cardinalit´e (ou simplement taille ). Nous d´enotons |A| la cardinalit´e de A, d´efinie comme ´etant
n si A contient exactement n ´el´ements, ∞ si le nombre d’´el´ements de A n’est pas fini.
Pour dire que A est fini, nous ´ecrivons souvent |A| < ∞. Il n’existe qu’un seul ensemble de cardinalit´e nulle, qui est l’ ensemble vide ∅ , caract´eris´e par le fait qu’aucun ´el´ement n’est contenu dans ∅.
D´efinition. Les ensembles A et B sont disjoints si
A ∩ B = ∅,
i.e., si A et B n’ont aucun ´el´ement en commun.
Soit X un ensemble et F une famille de sous-ensembles disjoints de X. La r´eunion disjointe des membres de F est not´ee (^) ⊔
A∈F
Il ne s’agit de rien autre que de l’union usuelle. Mais parfois, on parle de r´eunion disjointe et on ´ecrit ⊔ au lieu se ∪ pour souligner le fait que les ensembles sont disjoints. (Par exemple, de mani`ere g´en´erale, on a (^) ∣ ∣ ∣ ∣ ∣
A∈F
A∈F
ce qui n’est pas toujours vrai pour l’union usuelle.)
0.3.3 Ensembles des parties, Ensembles des mots
D´efinition. L’ ensemble des parties d’un ensemble X est d´efini comme ´etant l’ensemble de tous les sous-ensembles de X. L’ensemble des parties de X est not´e Pot(X) ou encore 2 X^.
L’ ensemble des parties finies de X est d´efini comme ´etant l’ensemble de tous les sous- ensembles finis de X. Il est not´e Pot∗(X).
On voit que si X est fini, alors on a Pot(X) = Pot∗(X).
Remarque: L’´ecriture 2 X^ est due au fait que si X est fini, on a | 2 X^ | = 2|X|. La notation Pot(X) vient de l’allemand: l’ensemble des parties s’appelle “die Potenzmenge” en allemand.
0.4 RELATIONS ET FONCTIONS
Dans toute cette partie, A et B seront des ensembles.
D´efinition. Une relation entre A et B est un sous ensemble R ⊆ A × B.
Si R ⊆ A × A, on dit que R est une relation sur A au lieu de “une relation entre A et A”.
Exemple: A = B = N,
R := {(m, n) | m, n ∈ N, m divise n}
est la relation de divisibili´e. On a donc (3, 12), (4, 4) ∈ R, mais (5, 9) ∈/ R.
Nous avons l’habitude de travailler avec des relations, mais en utilisant une notation diff´erente. Par exemple “≤” est une relation sur Z, mais il est plus pratique d’´ecrire “a ≤ b” que “(a, b) ∈ R≤”, o`u R≤ := {(m, n) | m, n ∈ Z, m ≤ n}.
D´efinition. La relation inverse de R est d´efinie par
R−^1 := {(b, a) ∈ B × A | (a, b) ∈ R}.
Exemple: La relation inverse de “≤” (R≤ dans l’exemple ci-dessus) est la relation sup´erieur ou egal `´ a “≥”.
D´efinition. Une relation R est dite sym´etrique si R = R−^1.
Exemple: Si P est un ensemble d’hommes, alors “ˆetre le frere de” est une relation sym´etrique sur P : Si David est le frere de Georges, alors Georges est aussi le fr`ere de David.
D´efinition. Une fonction partielle est une relation F ⊆ A × B qui v´erifie
∀a ∈ A : |{b ∈ B | (a, b) ∈ F }| ≤ 1. (2)
Une fonction est une fonction partielle pour laquelle on a ´egalit´e dans (2).
Si F est une fonction et (a, b) ∈ F , alors on ´ecrit b = F (a), et on dit que F envoie a sur b, ou aussi que b est l’ image de a par F.
On utilise parfois la notation F : A → B pour dire que F est une fonction de A vers B. L’ensemble de toutes les fonctions de A vers B est not´e BA.
On remarque que si F est une fonction F : A → B, alors pour chaque a ∈ A, il existe exacte- ment un b ∈ B tel que b = F (a). Nous avons l’habitude de travailler avec des fonctions, mais sans les consid´erer comme des relations. On voit une fonction plutˆot comme une transformation a laquelle on donne un ´` el´ement de A et qui nous retourne un ´el´ement de B.
Exemple: La relation F = {(a, b) | a, b ∈ R, b = a^2 }
est une fonction. La relation
R = {(a, b) | a, b ∈ R, b^2 = a}
n’est pas une fonction, car si a < 0 , il n’y a pas de b ∈ R tel que (a, b) ∈ R. En fait, R n’est mˆeme pas une fonction partielle, car si a > 0 , il y a deux valeurs de b ∈ R pour lesquelles (a, b) ∈ R. Cependant, la mˆeme relation d´efinie entre R≥ 0 et R≥ 0 est une fonction: il est facile de v´erifier que R′^ = {(a, b) | a, b ∈ R≥ 0 , b^2 = a}
a pour chaque a ∈ R≥ 0 exactement une image b ∈ R≥ 0. R′^ est la fonction racine carr´ee.
D´efinition. Une fonction F : A → B est dite surjective si pour tout b ∈ B, il existe a ∈ A tel que b = F (a).
Exemple: La fonction F = {(a, b) | a, b ∈ R, b = 2a + 1} est surjective, car pour tout b ∈ R, il existe un a ∈ R dont l’image par F est b, `a savoir a = (b − 1)/ 2. Par contre, G = {(a, b) | a, b ∈ R, b = a^4 + 1} n’est pas surjective. En effet, pour b = − 1 il n’y a pas de a ∈ R tel que F (a) = b.
D´efinition. Une fonction F est dite injective si F (a) = F (a′) implique que a = a′.
On remarque qu’une d´efinition ´equivalente de l’injectivit´e de F est a 6 = a′^ =⇒ F (a) 6 = F (a′).
Exemple: La fonction F = {(a, b) | a, b ∈ R, b = a^3 } est injective. En effet, si a^3 = b^3 alors on a a = b. Par contre, G = {(a, b) | a, b ∈ R, b = a^2 } n’est pas injective car G(1) = 1 = G(−1).
Si A = {a 1 ,... , am} est fini, alors il peut ˆetre pratique d’exprimer F : A → B sous la forme d’un vecteur. On ´ecrit (F (a 1 ),... , F (am)).
0.6 DU PROBLEMEA L’ALGORITHME ET SON IMPL´EMEN- TATION
Les ´etapes typiques dans la construction d’algorithmes et dans leur impl´ementation pratique sont les suivantes:
eme**. Souvent, le probleme nous est donn´e en prose (franc¸ais, anglais, allemand, ...) et la tˆache est de trouver une sp´ecification exacte. Quel est l’ensemble des inputs possibles, quel est l’ensemble des outputs possibles, et quelle est la d´ependance relationnelle entre les deux?eme en morceaux plus petits et plus g´erables.** Souvent le probleme est trop grand pour ˆetre attaqu´e d’un seul coup. Il doit ˆetre s´epar´e en sous-problemes plus petits, qui doivent ˆetre eux-mˆemes sp´ecifi´es. De plus, un m´echanisme doit ˆetre trouv´e pour “recoller” les solutions des sous-problemes afin d’obtenir une solution du probl`eme original.eme, un algorithme doit ˆetre con- struit pour le r´esoudre. Souvent en pratique l’une des nombreuses techniques de construc- tion d’algorithmes peut ˆetre utilis´eea cette fin. Cependant, dans certains cas, de nouveaux algorithmes doivent ˆetre constitu´es. La construction doit ˆetre motiv´ee par des contraintes d’efficacit´e, et donc des m´ethodes d’analyse d’algorithmes doivent ˆetre utilis´ees. De plus, tous les algorithmes doivent ˆetre v´erifi´es et prouv´es.1.1 CE QUE C’EST ET `A QUOI C¸ A SERT
L’induction math´ematique est une m´ethode pour prouver des affirmations concernant des ensem- bles d´enombrables. Dans la plupart des cas, cet ensemble sera l’ensemble des nombres naturels N.
Soit A(n) une affirmation pour l’entier n.
Exemple: Si A(n) d´eclare que “n^2 ≥ 2 n”, alors A(3) dit par exemple que “ 9 ≥ 8 ”, ce qui est vrai, donc A(3) est vraie. D’autre part, on peut trivialement v´erifier que A(5) n’est pas vraie. D’autres exemples d’affirmations A(n) sont “n est pair”, ou “n est un produit de nombres premiers”.
Si A(n) est vraie pour tout n ∈ N, alors l’induction math´ematique (aussi appel´ee r´ecurrence ) est souvent une fac¸on ´el´egante de le prouver.
1.2 TECHNIQUES D’INDUCTION
1.2.1 Induction simple
Th´eor`eme 1.1 Une affirmation A(n) est vraie pour tout n ∈ N si et seulement si les deux conditions suivantes sont vraies:
(2) Pour tout n ≥ 1 : A(n) =⇒ A(n + 1).
D´efinition. La technique d’ induction simple consiste a montrer que A(n) est vraie pour tout n ∈ N en utilisant le th´eoreme pr´ec´edent. Le point (1) s’appelle la base d’induction et le point (2) le pas d’induction. Dans les preuves, nous marquerons les ´etapes correspondantes par [ Base ] et [ Pas ] respectivement.