DHDHDHSJSJDJDHDDHDHDHDHD
DHDHDHSJSJDJDHDDHDHDHDHD
DHDHDHSJSJDJDHDDHDHDHDHD
Travail à faire :
1. Implémenter un algorithme de la force brute pour évaluer le polynôme
n 1
p ( x ) a n x a n 1 x a 1 x a 0 en un point donné x 0 et déterminer la classe
n
d’efficacité au pire.
2. Si l’algorithme que vous avez conçu est dans n 2 , implémenter un autre algorithme
linéaire, par exemple celui de Hörner, pour ce problème.
3. Faites une comparaison du temps d’exécution de ces deux programme pour n=25, 50,
100 et 1000.
x ys .
2
définie par d ( x , y ) s
s 1
Etant donné une chaîne de n caractères appelée texte et une chaîne de m caractères
( m n ) appelée forme, trouver une sous chaîne du texte égale à cette forme. Pour le dire plus
précisément, il s’agit de trouver un indice i —l’indice du caractère le plus à gauche de la
première sous-chaîne assortissante dans le texte—tel que t i p 0 , ,t i j p j , , t i m 1 p m 1 :
t0 ti ti j t i m 1 t n 1 Texte T
↕ ↕ ↕
p0 pj p m 1 Forme P
Evidemment, après avoir obtenu une partition, A[s] sera dans sa position finale dans le vecteur
trié, et nous pouvons continuer le tri des deux sous-vecteurs formés des éléments qui
précèdent et qui suivent A[s] séparément (par exemple, par la même méthode).
ALGORITHME QuickSort(A[L..R])
//Trie un sous-vecteur par le quicksort
//Input : Un sous-vecteur A[L..R] de A[0..n – 1] défini par ses indices inférieur et
supérieur.
//Output : Le sous-vecteur A[L..R] trié par ordre croissant
if L R
s Partition(A[L..R]) // s est la position de coupure
QuickSort(A[L..s – 1])
QuickSort(A[s + 1..R])
Une partition de A[0..n – 1] et, plus généralement, de ses sous-vecteurs peut être obtenue par
l’algorithme suivante. D’abord, on choisit un élément par rapport auquel on va diviser le sous-
vecteur. A cause de son rôle directeur, on appelle cet élément le pivot. Il existe plusieurs
stratégies différentes pour choisir le pivot, nous reviendrons sur ce sujet lorsque nous
analyserons l’efficacité de l’algorithme.
Travail à faire : Implémenter le QuickSort () si la stratégie de la fonction Partition ()
consiste à :
1. Prendre le premier élément du sous-vecteur comme pivot : p A[ L ] ;
2. Prendre le dernier élément du sous-vecteur comme pivot : p A[ R ] .
3- Ecrire le programme principal qui trie les éléments du Tab selon l’ordre croissant de
leurs normes.
Supposons que A et B sont deux nombres entiers de 2n chiffres (on ajoute des zéros
supplémentaires si nécessaire pour avoir des nombres de longueur). Posons
A ( a 2 n 1 a 2 n 2 a1 a 0 ) 10 et B ( b 2 n 1b 2 n 2 b1b 0 ) 10
Soit A 10 n A1 A0 , B 10 n B1 B 0
Où A1 ( a 2 n 1 a n 1 a n )10 , A0 ( a n 1 a1 a 0 ) 10
B1 ( b 2 n 1 b n 1b n ) 10 , B 0 ( b n 1 b1b0 ) 10
L’algorithme pour la multiplication rapide des entiers est basé sur l’identité
AB (10 10 ) A1 B1 10 ( A1 A0 )( B 0 B1 ) (10 1) A0 B 0
2n n n n
10 A1 B1 10 ( A1 B 0 A0 B1 ) A0 B 0
2n n
C 2 10 C 110 C 0
2n n
2 a b c d a b c d
a b
a 0 3 a 0 10 3 4
3 6 7 W= b 2 0 D= b 2 0 5 6
c d c 7 0 1 c 7 7 0 1
1
d 6 0 d 6 16 9 0
Figure 3 : (a) Un digraphe. (c) Sa matrice des poids. (c) Sa matrice des distances.
L’algorithme de Floyd calcule la matrice des distances d’un graphe pondéré avec n sommets à
travers une série de matrices d’ordre n :
(0) ( k 1 ) (k ) (n)
D , , D ,D , , D (13.2)
Chacune de ces matrices contient les longueurs des plus courts chemins avec certaines
contraintes sur les chemins considérées pour la matrice en question. Précisément, l’élément
(k )
d ij dans la ième ligne et la jème colonne de la matrice D ( k ) ( 0 k n ) est égal à la
longueur du plus court chemin parmi tous les chemins du ième somme au jème sommet,
chaque sommet intermédiaire, s’il en existe, ayant un numéro inférieur à k. En particulier, la
suite commence avec D ( 0 ) , qui n’autorise aucun sommet intermédiaire dans ses chemins ; par
conséquent D ( 0 ) n’est pas autre chose que la matrice des poids du digraphe. La dernière
matrice de la suite D ( n ) , contient les longueurs des plus courts chemins parmi tous les
chemins qui peuvent utiliser tous les n sommets comme intermédiaires et par conséquent elle
n’est pas autre chose que la matrice des distances que nous cherchons.
Comme dans l’algorithme de Warshall, nous pouvons calculer tous les éléments de chaque
matrice D ( k ) à partir de son prédécesseur immédiat D ( k 1) dans la suite (13.2). Soit d ij( k ) ,
l’élément de la ième ligne et de la jème colonne de la matrice D ( k ) . Ceci signifie que d ij( k ) est
égal à la longueur du plus court chemins parmi tous les chemins du ième sommet v i au jème
somment v j dans lequel chaque sommet intermédiaire a un numéro inférieur à k :
Nous pouvons diviser de tels sommets en deux sous-ensembles disjoints : ceux qui n’utilisent
pas le kème sommet v k comme intermédiaire et ceux qui ne le font pas. Comme les
intermédiaires des chemins du premier sous-ensemble ont des numéros inférieurs à k 1 , le
plus court d’entre eux est par définition de nos matrices, de longueur d ij( k 1 ) .
( k 1 )
( k 1 )
d kj
d ik
vk
Comme la longueur du plus court chemin de de v i à v k parmi les chemins qui utilisent des
sommets intermédiaires ayant un numéro inférieur à k – 1 est égal à d ik( k 1 ) et la longueur du
plus court chemin de v k à v j parmi tous les chemins qui utilisent des sommets intermédiaires
ayant un numéro inférieur à k – 1 est égal à d kj( k 1 ) , la longueur du plus court chemin parmi les
chemins qui utilisent le kème sommet est égale à d ik( k 1) d kj( k 1) . La prise en compte des
longueurs des plus courts chemins dans les deux sous-ensembles conduit à la récurrence
suivante :
d ij min d ij , d ik d kj pour k 1 , d ik w ij
(k ) ( k 1 ) ( k 1 ) ( k 1 ) (0)
(13.1)
Pour le dire autrement, l’élément de la ième ligne et jème colonne de la matrice des distances
courante D ( k 1) est remplacé par la somme des éléments de la même ligne i et le kème colonne
et la même colonne j et la kème colonne si et seulement si cette dernière somme est plus petite
que sa valeur courante.
L’application de l’algorithme de Floyd au graphe de la Figure 3 est illustrée à la Figure 5.
a b c d
a 0 3 Les longueurs des plus courts chemins sans sommet
(0)
D(0) = b 2 0 intermédiaire. (D est juste simplement la matrice
des poids).
c 7 0 1
d 6 0
a b c d
a 0 3 Les longueurs des plus courts chemins dont les
sommets intermédiaires ont des numéros inférieur à
(1)
D = b 2 0 5
un, i.e., juste le sommet a (noter deux nouveaux plus
c 7 0 1 courts chemins de d à c et de d à c).
d 6 9 0
a b c d
a 0 10 3 4 Les longueurs des plus courts chemins dont les
D (3)
= b 2 0 5 6 sommets intermédiaires ont des numéros inférieur à
3, i.e., a, b et c (noter quatre nouveaux plus courts
c 9 7 0 1 chemins de a à b, de a à d, de b à d et de d à b).
d 6 16 9 0
a b c d
a 0 10 3 4 Les longueurs des plus courts chemins dont les
D (4)
= b 2 0 5 6 sommets intermédiaires ont des numéros inférieur à
3, i.e., a, b, c et d (noter un nouveau plus court
c 7 7 0 1 chemin de c à a).
d 6 16 9 0
Voici un pseudocode de l’algorithme de Floyd. Il s’appuie sur le fait que la matrice suivante
de la suite (13.2) peut être écrite au-dessus de la précédente.
Nous terminons cette section avec un important commentaire général. Il traite d’un principe
général qui sous-tend les algorithmes de programmation dynamique pour les problèmes
d’optimisation. Richard Bellman l’appelle le principe d’optimalité. En termes quelques peu
différents de sa formulation originale, il dit qu’une solution optimale à une instance d’un
problème d’optimisation est composé de solutions optimales à ses sous-instances. Le principe
d’optimalité tient plus souvent que non. Bien que son applicabilité à un problème particulier
Travail demandé :
1- Ecrire une fonction qui prend en entrée une matrice et renvoie true ou false selon que la
matrice soit de Pascal ou non.
2- Ecrire une fonction qui prend en entrée une matrice nulle et la transforme en une matrice
de Pascal.
2. La deuxième est simplement basée sur la définition du plus grand diviseur commun de m
et n comme le plus grand entier qui divise les deux nombres. Clairement, un tel diviseur
3. La troisième procédure pour le calcul du plus grand diviseur commun sera familière aux
élèves des classes intermédiaires.
Procédure des classes intermédiaires pour le calcul de GCD(m, n)
Etape 1. Trouver la décomposition en facteurs premiers de m.
Etape 2. Trouver la décomposition en facteurs premiers de n.
Etape 3. Identifier tous les facteurs communs des décompositions en facteurs
premiers trouvées à l’Etape 1 et à l’Etape 2. Si p est un facteur
commun apparaissant pm fois et pn fois dans m et n, respectivement, il
sera répété min{pm, pn} fois.
Etape 4. Calculer le produit de tous les facteurs communs et retourner ce produit
comme le plus grand diviseur commun des nombres m et n.
Présentons maintenant un algorithme simple pour générer les nombres premiers consécutifs
inférieurs à un entier donné n. L’algorithme commence par initialiser la liste des nombres
premiers candidats par les entiers consécutifs de 2 à n. Ensuite, à la première itération de
l’algorithme, on élimine de la liste tous les multiples de 2. Ensuite on passe au deuxième
élément de la liste qui est 3, et on élimine tous ses multiples. Le prochain nombre restant dans
la liste et qui est utilisé à la troisième itération est 5. Comme pour 2 et 3, tous les multiples de
5 sont supprimés de la liste. L’algorithme continue de cette façon jusqu’à ce qu’aucun nombre
ne puisse plus être supprimé de la liste. Les nombres restant de la liste sont les nombres
premiers recherchés.
Travail demandé :
1- Ecrire une fonction PGCDEuclide() qui reçoit deux positifs non tous nuls n et m en
paramètre et utilise la méthode d’Euclide pour retourner le plus grand diviseur
commun de m et n.
2- Ecrire une fonction PGCDSoustraction() qui reçoit deux positifs non tous nuls n et m
en paramètre et utilise la méthode de vérification des entiers consécutifs pour le
calcul de plus grand diviseur commun de m et n tous non nuls.
3- Ecrire une fonction Eratosthenes() qui recoit n entier positif et renvoie un tableau des
nombres premiers consécutifs inférieurs à un entier donné n.
4- Ecrire une fonction PGCDClasseIntermediaire() qui reçoit deux positifs non tous nuls
n et m en paramètre et utilise la procédure des classes intermédiaires pour le calcul
pour le calcul de plus grand diviseur commun de m et n tous non nuls.
Pn
P1
Pmax
Pn
P1
Figure 2 : L’idée du Quichhull
Travail à faire :
1. Implémenter l’algorithme du Quickhull.
2. Expliquer comment on peut trouver analytiquement le point Pmax dans l’algorithme du
Quickhull.
3. Quelle est l’efficace au mieux du Quickhull ?
4. Donner un exemple spécifique d’entrées qui permettent à l’algorithme du Quickhull
d’avoir un temps d’exécution quadratique.
Groupe_01 = {1, 20, 3, 18, 5, 17} Groupe_11 = {11, 10, 13, 8, 15, 7}
Groupe_02 = {2, 1, 4, 19, 6, 18} Groupe_12 = {12, 11, 14, 9, 16, 8}
Groupe_03 = {3, 2, 5, 20, 7, 19} Groupe_13 = {13, 12, 15, 10, 17, 9}
Groupe_04 = {4, 3, 6, 1, 8, 20} Groupe_14 = {14, 13, 16, 11, 18, 10}
Groupe_05 = {5, 4, 7, 2, 9, 1} Groupe_15 = {15, 14, 17, 12, 19, 11}
Groupe_06 = {6, 5, 8, 3, 10, 2} Groupe_16 = {16, 15, 18, 13, 20, 12}
Groupe_07 = {7, 6, 9, 4, 11, 3} Groupe_17 = {17, 16, 19, 14, 1, 13}
Groupe_08 = {8, 7, 10, 5, 12, 4} Groupe_18 = {18, 17, 20, 15, 2, 14}
Groupe_09 = {9, 8, 11, 6, 13, 5} Groupe_19 = {19, 18, 1, 16, 3, 15}
Groupe_10 = {10, 9, 12, 7, 14, 6} Groupe_20 = {20, 19, 2, 17, 4, 16}