Académique Documents
Professionnel Documents
Culture Documents
sub Dplacer (nombre, de, , par) si nombre > 0 alors Dplacer (nombre-1, de, par, ) Bouger-un-disque (de, ) Dplacer (nombre-1, par, , de) fin-du-si fin-du-sub
COMPLEXITE DE LALGORITHME :
On dmontre par rcurrence : N = 1 : 2(1) -1= 1 cest vrai On suppose que cest juste pour lordre N : T(n)= 2(n) - 1 Et on la dmontre pour lordre n+1 :
T(n+1)= 2*T(n)+1 on remplace T(n) par 2(n)-1
Ce qui donne : Avec la notation de landau cest une complexit exponentielle O(2(n)).
CODE SOURCE EN C :
#include<stdio.h> #include<time.h> void Tour(int nbdis,int A ,int B,int C); clock_t
temps_initial, /* temps initial en micro-secondes */ temps_final; /* temps final en micro-secondes */ float temps_cpu; main() { /* temps total en secondes */
int nbr;
else {
} //fin else
} //fin Tour
8 0,227
9 0,317
10 0,526
11 0,943
12 1,446
13 2,958
14 4,811
15 11,453
16 12,410
17 22,645
18 41,343
19 86,326
20 193,156
21 347,195
Ainsi de suit donc T(n)=2*T(n)=2*2*T(n-1) =2*2.......2*T(1)=2(n-1)*T(1) Il s'agit d'une complexit exponentielle en O(2(n)). Donc effectivement, il y'a une correspondance entre le rsultat thorique et les mesures exprimentales.
ALGORITHME ITERATIF :
Dclarer les variables ; Initialiser la pile ; si (nbdis == 1) alors { printf("\nDeplacer un disque de %d -> %d\n",A,B); } Sinon { Tant que ( nbdis > 1 ){ Empiler contexte ; Nbdis-- ; Switch B et C ; } printf("\nDeplacer un disque de %d -> %d\n",A,B); Tant que (PileNonVide){
Depiler contexte ; printf("\nDeplacer un disque de %d -> %d\n",A,B); nbdis-- ; switch A et C ; Tant que (nbdis > 1 ){ Empiler contexte ; Nbdis-- ; Switch B et C ; } printf("\nDeplacer un disque de %d -> %d\n",A,B); } }
COMPLEXITE DE LALGORITHME :
Le dplacement s'effectue a chaque a chaque itration de la boucle pour donc coups fois avec coups=2n-1 tell que n = le nombre des disques. Donc la complexit de cet algorithme est en O(2n) #include <stdio.h> #include <time.h>
void Tour(int nbdis,int A ,int B,int C); typedef struct elt{int info ; struct elt *svt;}pile; void initpile (pile **sommet); void empiler ( pile **sommet, int x); void depiler (pile **sommet, int *x); int pilevide (pile *sommet); clock_t
temps_initial, /* temps initial en micro-secondes */ temps_final; /* temps final en micro-secondes */ float temps_cpu; main() { /* temps total en secondes */
int nbr;
int x,compteur = 0 ;
pile *s; s = (pile *) malloc(sizeof(pile)); initpile(&s); if (nbdis == 1) { printf("\nDeplacer un disque de %d -> %d\n",A,B); }
empiler(&s,nbdis); empiler(&s,A);
while (!pilevide(s)){
nbdis = nbdis - 1 ; x = A; A = C; C = x;
} } }
8 0,522
9 0,334
10 0,354
11 0,760
12 1,251
13 2,071
14 4,028
15 9,428
16 11,521
17 33,519
18 61,629
19 12,262
20 191,706
21 323,947
1. Comparaison entre la complexit thorique et la complexit exprimentale: On remarque que T(15)= 9,428=~ 2* 4,028=~2*T(14) Plus gnralis : T(n)=2*T(n-1) =2n-1T(1) Donc la complexit est en O(2n). On remarque qu'il y'a une correspondance entre le rsultat thorique et les mesures exprimentales.