Programmation Dynamique

Telechargé par pierre.kelbert
La programation dynamique
Fran¸cois Lemieux
UQAC
Fran¸cois Lemieux (UQAC) La programation dynamique 1 / 51
La programmation dynamique
1Le compromis espace/temps
2Principes de la programmation dynamique
3Exemple 1: Calcul des nombres de Fibonacci
4Exemple 2: Concat´enation de nombres premiers
5Exemple 3: Multiplication chaˆın´ee de matrices
6Exemple 4: Plus court chemin dans un graphe (Floyd)
7Exemple 5: Sous-chaˆıne commune de longueur maximale
8Exemple 6: Disposer des mots en paragraphe
Fran¸cois Lemieux (UQAC) La programation dynamique 2 / 51
Le compromis espace-temps
Une situation r´ecurrente en informatique est que la diminution du temps
d’ex´ecution d’un algorithme se fait souvent au prix d’une augmentation de
l’espace m´emoire.
Exemple: Une fonction f:NNpeut ˆetre remplacer par une table des
valeurs.
Similairement, diminuer l’utilisation de l’espace m´emoire peut ˆetre fait si
on accepte d’augmenter le temps d’ex´ecution.
Exemple. Lecture et ´ecriture dans un fichier compress´e.
Fran¸cois Lemieux (UQAC) La programation dynamique 3 / 51
Principes de la programmation dynamique
On ´evite de refaire certains calculs en les m´emorisant dans une table.
Cette m´ethode est souvent utilis´ee lorsque l’on ne peut pas utiliser un
algorithme diviser-pour r´egner pour une des raisons suivantes:
1Un algorithme diviser-pour-r´egner se r´ev`ele inefficace parce qu’il refait
souvent les mˆemes appels r´ecursifs
2Un algorithme diviser-pour-r´egner serait efficace si seulement on
pouvait “deviner” comment diviser le probl`eme
Nous allons voir deux exemples qui illustrent ces situations.
Fran¸cois Lemieux (UQAC) La programation dynamique 4 / 51
Exemple 1: Nombres de Fibonacci
Algorithme diviser-pour-r´egner (approche descendante):
fib1(n)
si (n<2) retourner n
sinon retourner fib1(n-1) + fib1(n-2)
Le temps est Θ(φn) o`u φ=1+5
2
Comme il n’y a que nparam`etres possibles, alors il y a une multitude
d’appels identiques.
Fran¸cois Lemieux (UQAC) La programation dynamique 5 / 51
fib(5)
fib(3) fib(4)
fib(1) fib(2) fib(3)fib(2)
fib(0) fib(1) fib(1)fib(0) fib(1) fib(2)
fib(1)fib(0)
Fran¸cois Lemieux (UQAC) La programation dynamique 6 / 51
Meilleure solution
On utilise une table T[1 · · · n] initialis´e `a 0
Apr`es le premier appel `a fib(k) on met le r´esultat dans T[k]
Avant chaque appel `a fib(k) on regarde dans T[k] pour voir si le
r´esultat a d´ej`a ´et´e calcul´e.
Fran¸cois Lemieux (UQAC) La programation dynamique 7 / 51
Approche descendante (fonctions `a m´emoire)
L’approche descendante est la fa¸con r´ecursive d’impl´ementer un
algorithme de programmation dynamique.
Une fonction r´ecursive qui utilise une table pour ´eviter de r´ep´eter des
calculs est appel´ee fonction `a m´emoire.
fib2(n)
si T[n]>0 alors retourner T[n]
si n<2 alors T[n]=n
sinon T[n] = fib2(n-1) + fib2(n-2)
retourner T[n]
Le temps est Θ(n)
Fran¸cois Lemieux (UQAC) La programation dynamique 8 / 51
fib(5)
fib(3) fib(4)
fib(1) fib(2) fib(3)
fib(3)
fib(2)
fib(2)
fib(0) fib(1)
fib(1)
fib(1)
fib(1)
fib(0)
fib(0)
fib(1)
fib(1)
fib(2)
fib(2)
fib(1)
fib(1)
fib(0)
fib(0)
Les sous-arbres en rouges correspondent `a des calculs qui ont d´ej`a ´et´e
effectu´es.
Fran¸cois Lemieux (UQAC) La programation dynamique 9 / 51
fib(5)
fib(3) fib(4)
fib(1) fib(2) fib(3)fib(2)
fib(0) fib(1)
Les noeuds internes correspondent `a des appels r´ecursifs distincts, ce qui
garantie un temps lin´eaire.
Fran¸cois Lemieux (UQAC) La programation dynamique 10 / 51
Approche ascendante
Il s’agit d’une m´ethode it´erative o`u on remplit la table de fa¸con
ascendante: On commence par les entr´ees correspondant aux
sous-probl`emes de petite taille.
fib2(n)
T[0]=0
T[1]=1
pour i=2 `a n faire
T[i] = T[i-1] + T[i-2]
Le temps est Θ(n)
Remarque: Dans ce cas ci, le tableau peut ˆetre remplac´e par deux
variables enti`eres.
Fran¸cois Lemieux (UQAC) La programation dynamique 11 / 51
Exemple 2: Concat´enation de nombres premiers
Supposons que nous disposions d’un algorithme Premier(w) permettant
de d´eterminer si une s´equence de bits wrepesente un nombre premier:
Premier(w) = 1si west premier
0sinon
Fran¸cois Lemieux (UQAC) La programation dynamique 12 / 51
Description du probl`eme
Entr´ee: Une s´equence de nbits w=b1b2· · · bn
Sortie: Vrai si on peut ´ecrire wsous la forme w=w1w2· · · wm
(m>0) tel que wiest l’encodage binaire d’un nombre
premier, faux sinon.
Exemple: La s´equence w= 1110110 est la concat´enation de 11 (3), 101
(5) et 10 (2). Remarquez que cette solution n’est pas unique puisqu’on
peut aussi d´ecomposer wen 11101 (29) et 10 (2).
Fran¸cois Lemieux (UQAC) La programation dynamique 13 / 51
Approche diviser-pour-r´egner
Sequence(w)
Si (Premier(w)=1) alors retourner vrai
Si (n=1) retourner faux
Trouver une d´ecomposition w=uv
Si Sequence(u)=vrai et Sequence(v)=vrai alors
retourner vrai
Sinon
retourner faux
Si on pouvait trouver efficacement une telle d´ecomposition alors
l’algorithme Sequence serait aussi efficace.
Fran¸cois Lemieux (UQAC) La programation dynamique 14 / 51
Remarque
Une id´ee serait de choisir ucomme le plus petit pefixe de wtel que
Premier(u) = 1.
Si un tel pefixe n’existe pas alors on retourne faux.
Malheureusement, cette id´ee ne fonctionne pas.
Exemple: Si w= 10110001 alors 10 (2) est le plus petit pr´efixe de wqui
soit premier. Cependant, la seule d´ecomposition possible de west 101 (5)
et 10001 (17).
Fran¸cois Lemieux (UQAC) La programation dynamique 15 / 51
1 / 17 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !