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

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 sous-
problè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)=

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
Fibo (n)
Entrée : n
Sortie : f(n)
Si n=0 ou n=1 sortir 1
Sortir Fibo (n-1) + Fibo(n-2)
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)
Principe de la prog dynamique
On ne fait jamais 2 fois le meme calcul
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 }
Complexité O(n)
1 / 2 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 !