• Aucun résultat trouvé

Entraînement au concours ACM-ICPC Récursion, mémoïsation, programmation dynamique

N/A
N/A
Protected

Academic year: 2022

Partager "Entraînement au concours ACM-ICPC Récursion, mémoïsation, programmation dynamique"

Copied!
17
0
0

Texte intégral

(1)

23 mai 2013

Entraînement au concours ACM-ICPC

Récursion, mémoïsation, programmation dynamique

(2)

Plan

Récursion Mémoïsation

Programmation dynamique

(3)

23 mai 2013

Quand utiliser la récursion ?

Un problèmeP peut être résolu par récursion quand :

Il peut être paramétré parun ou plusieurs entiersP(n1. . .nk) La solution deP(n1. . .nk)peut être calculéeà partir dela solution deP(n1(1). . .nk(ℓ))pourun certain>1avec pour tout 16i 6ℓ, chaquen(i)j 6nj pour 16j6k, l’une de ces inégalités étant stricte (∃16j6ℓ,n(i)j <nj)) :cas récursif

P(0. . .0)(ouP(n1. . .nk avecni « petit » suivant les cas)facile à calculer:cas de base

(4)

Exemple 1 : Factorielle

P(n) =n!

k =1,=1

P(n) =n×P(n−1)pourn>1 P(0) =1

(5)

23 mai 2013

Exemple 2 : Fibonacci

P(n)n-ième nombre de Fibonacci k =1,=2

P(n) =P(n−1) +P(n−2)pourn>1 P(0) =1,P(1) =1

(6)

Exemple 3 :

distance d’édition de Levenshtein

d(s,s)distance d’édition (nombre minimal de caractères à ajouter, enlever, modifier) pour passer desàs.

P(n1,n2)distance d’éditionentre lepréfixede longueurn1deset lepréfixede longueurn2des

k =2,=3 P(n1,n2) = min(︁

P(n11,n2) +1,P(n1,n21) +1,P(n11,n21) +Isn1̸=sn

2

)︁

pourn1>1,n2>1

P(n1,0) =n1pourn1>0 ;P(0,n2) =n2pourn2>0.

Ibvaut 1 sibest vrai, 0 sinon

(7)

23 mai 2013

Implémentation

Fonction récursive functionP(n1, . . . ,nk); ifcas de basethen

. . . ;

return. . .; else

// cas récursif . . . ;

// appels à P return. . .;

end

On dit que la récursion est terminale si=1 et si l’appel àPest la dernière instruction appelée du cas récursif (returnP(n1, . . . ,nk))

(8)

Complexité

Bornessupérieures(parfois meilleures, par exemple si l’appel récursif se fait sur n2 et pas surn−1) :

Si=1 :O(n1× · · · ×nk): souventacceptable Sil >1 :O(ℓn1×···×nk): souventnon raisonnable

Attention à l’espace mémoiresur la pile:O(∑︀ki=1ni)(en général l’espace allouée à la pile va de quelques centaines de kilo-octets à quelques méga-octets).

En cas de récursion terminale, le compilateur (Java, C++) peut éliminer la récursion, et donc l’espace sur la pile requis

(9)

23 mai 2013

Plan

Récursion Mémoïsation

Programmation dynamique

(10)

Principe (1/3)

Mémoire: objet global (ou statique, ou membre de classe) qui se souvient des résultats de la fonctionP d’un appel à l’autre

(11)

23 mai 2013

Principe (2/3)

functionP(n1, . . . ,nk);

ifM(n1, . . . ,nk)est défini then returnM(n1, . . . ,nk); else

ifcas de basethen . . . ;

r ←. . . ; else

// cas récursif . . . ;

// appels à P r ←. . . ;

end

M(n1, . . . ,nk)←r; returnr;

end

(12)

Principe (2/2)

Récursion terminale impossible !

Structure de données :tableau multi-dimensionneloutableau associatif(map) implémenté comme un arbre binaire de recherche (TreeMap en Java, map en C++) ou comme une table de hachage (HashMap en Java, unordered_map en C++ 2011/TR1). . .

(13)

23 mai 2013

Complexité

O(n1× · · · ×nk×ℓ)opérations

O(n1× · · · ×nk)espace mémoire sur le tas (espace occupé dépend de la structure de données utilisée)

O(∑︀ki=1ni)espace mémoire sur la pile Pas de calculs inutiles !

(14)

Plan

Récursion Mémoïsation

Programmation dynamique

(15)

23 mai 2013

Principe

Calculitératif

On construit unematrice(tableau multi-dimensionnel)n1× · · · ×nk qu’on remplit itérativement du bas vers le haut

functionP(n1, . . . ,nk);

M←matrix(n1,i. . . ,nk)fori1←1ton1do . . . ;

forik ←1tonk do . . . ;

M(i1, . . . ,ik)←. . .;

// utilise les valeurs calculées end

end

returnM(i1. . .ik);

(16)

Complexité

Θ(n1× · · · ×nk×ℓ)opérations

Θ(n1× · · · ×nk)espace mémoire sur le tas O(1)espace mémoire sur la pile

Parfois trop d’opérations !

g(n) =O(f(n)):g(n)6k·f(n)pour unk >0 etnsuffisamment grand

g(n) = Ω(f(n)):g(n)>k·f(n)pour unk >0 etnsuffisamment grand

g(n) = Θ(f(n)): à la foisg(n) =O(f(n))etg(n) = Ω(f(n))

(17)

23 mai 2013

Licence de droits d’usage

Contexte public} avec modifications

Par le téléchargement ou la consultation de ce document, l’utilisateur accepte la licence d’utilisation qui y est attachée, telle que détaillée dans les dispositions suivantes, et s’engage à la respecter intégralement.

La licence confère à l’utilisateur un droit d’usage sur le document consulté ou téléchargé, totalement ou en partie, dans les conditions définies ci-après et à l’exclusion expresse de toute utilisation commerciale.

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique ou papier,

– le droit de diffuser tout ou partie du document au public sur support papier ou informatique, y compris par la mise à la disposition du public sur un réseau numérique,

– le droit de modifier la forme ou la présentation du document,

– le droit d’intégrer tout ou partie du document dans un document composite et de le diffuser dans ce nouveau document, à condition que : – L’auteur soit informé.

Les mentions relatives à la source du document et/ou à son auteur doivent être conservées dans leur intégralité.

Le droit d’usage défini par la licence est personnel et non exclusif.

Tout autre usage que ceux prévus par la licence est soumis à autorisation préalable et expresse de l’auteur :sitepedago@telecom-paristech.fr

Références

Documents relatifs

Ajout/suppression d’un élément arbitraire par sa clef : O(1) amorti En Java, il existe aussi LinkedHashMap qui combine table de hachage et liste chaînée pour accès rapide et

Recherche d’une sous-chaîne de taille non négligeable d’une longue chaîne : Knuth–Morris–Pratt (ou Boyer–Moore, non traité ; KMP est meilleur quand l’alphabet est petit,

Le droit d’usage d ´efini par la licence autorise un usage `a destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

programme (cout, cerr) pour pouvoir rediriger les flux d’information En Shell Unix : &gt; pour rediriger la sortie standard, 2&gt; pour rediriger la sortie d’erreur, | pour envoyer

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique