ICC Semaine 3 Semaine 2 : algorithme / ingrédients de base

advertisement
ICC Semaine 3
Semaine 2 : algorithme / ingrédients de base / complexité
Semaine 3 : Conception d’algorithmes : Récursivité et programmation dynamique
Une approche fréquente pour résoudre un problème est de le décomposer en sousproblèmes, chacun plus simple à résoudre.
Une classe particulière d’algorithmes qui fonctionnent sur ce principe sont les
algorithmes récursifs : algo qui fait appel à lui-même
Ex : calcul de la somme des n premiers nombres entiers
VERSION ITERATIVE :
Entrée : nombre entier positif n
Sortie : S(n)=∑=1 
i0
Pour i allant de 1 à n
xx+i
Sortir x
VERSION ALGO RECURSIF : Algo_rec
Entrée : nombre entier positif n
Sortie : S(n)
Si n + 1, sortir 1
≫≫ C’est la condition d’arrêt, OBLIGATOIRE ‼
Sortir n + algo_rec(n-1)
≫ Fait appel à lui même et test avec la valeur (n-1)
Si n=3 > n ≠ 1
Sortir 3 + algo_rec (2)
N≠1
Sortir 2 + algo_rec(1)
N=1 donc sort 1
2+1 = 3
3+3=6
Recherche d’un élément dans une liste ordonnée
Soit L une liste ordonnée : L = {-40, -12, 3, 17, 22, 40, 41, 57}
x un nombre entier
On aimerait savoir si x ∈  ?
ALGO DE DICHOTOMIE  Prendre toute la liste, la diviser par 2 pour travailler sur une
plus petite liste
Entrée : liste L ordonnée, taille n, nombre x
Sortie : x ∈  ?
Si n = 1 { si x = L(1), sortir oui, sinon, sortir non} ≫ si la taille de ma liste est de 1
m = n/2 ≫ partie entière supérieure
Si x ≤ L(n), sortir dichotomie (L(1 ; m), m, x) ≫L(1 ; m) est la première partie de la liste
Sinon sortir dichotomie (L(m+1 ; n), (n-m) ; x)
ICC Semaine 3
ALGORITHMES DE TRI :
Tri par insertion
L = {2, 4, 6, 3, 51} ≫ si je vois un nombre qui est plus petit que le précédent (ici 3), je
vais décaler L(i) jusqu’à sa bonne place
Entrée : L liste non-triée, taille n
Sortie : L triée (dans l’ordre croissant)
Si n = 1, sortir L
Pour i allant de 2 à n : si L(i) < L(i – 1), décale L(i) jusqu’à la position j telle que
L(j-1) < L(i) ≤ L(j)
Au pire, pour déplacer un nombre, on le déplacera n fois vers la droite ou la gauche, et
cela n fois parce que ya n nombre
Donc Complexité O(n2)
Tri_fusion (algorithme récursif)
Entrée : Liste L, taille n
Sortie : Liste triée L
Si n = 1, sortir L (≫ condition d’arret)
m  n÷2
L1  tri_fusion(L(1:m) ; m )
L2  tri_fusion(L(m+1:n) ; n-m )
Fusionner L1 et L2 en une liste L’
Sortir L’
On ouvre pleins de boite qui sont de plus en plus petites du coup elles se trient au fur et
à mesure puis quand on fusionne, la liste est triée.
Complexité : O(nlog2n) <  (n2)
PROGRAMMATION dynamique
Nombres de Fibonacci
F(0) = 1, f(1)=1, f(n)=f(n-1) + f(n-2) ∀ n
≥2
Principe de la prog dynamique
On ne fait jamais 2 fois le meme calcul
Fibo (n)
Entrée : n
Sortie : f(n)
Si n=0 ou n=1 sortir 1
Sortir Fibo (n-1) + Fibo(n-2)
Fibo2
Entrée : n
Sortie : f(n)
Si n= 0 ou 1, sortir 1
Y  1, z 1
Pour i allant de 2 à n :
{xy+z
zy
yx }
On peut monter qu’on aura f(k) fois la
boite n-k  on doit ouvrir en tout cas
f(n) boites (c’est à dire f(n) opérations)
Complexité O(n)
Téléchargement