[Résolu] Evaluer la complexité de morceaux d'algo

Evaluer la complexité de morceaux d'algo [Résolu] - Algo - Programmation

Marsh Posté le 27-12-2006 à 21:27:43    

Bonsoir,
je recherche un coup de main.  
Je révise mes partiels d'algo. avancée et je voudrais savoir si mes évaluations de complexité sont correctes et si non j'aimerais si possible que l'on m'explique pourquoi.  
Ces morceaux d'algo me posent problème, du moins je ne suis pas certain du résultat.
 

Code :
  1. j:=1;
  2. tantque j<n faire
  3.    p:=1;
  4.    tantque p<j faire  /* modifié */
  5.       p:=p*2
  6.    fin tantque
  7.    si p=j /*j est une puissance de 2*/ alors
  8.       j:=2*j+1
  9.    sinon
  10.       j:=j+1
  11.    finsi
  12. fin tantque
  13. // complexité que je trouve: O(n), correct ?


 

Code :
  1. j:=2;
  2. k:=n;
  3. tantque j<k faire
  4.    j:=j*j
  5.    k:=k*n
  6. fin tantque
  7. // complexité que je lui donne : O(log n) sans vraiment savoir pourquoi
  8. // je vois bien que j croît bien plus vite que k, et que donc pour un n assez grand, la complexité me semble bien inférieure à n


 

Code :
  1. j:=1;
  2. pour i allant de 1 à n par pas de 1 faire
  3.    tantque j<i*i faire
  4.       j:=j+j
  5.    fin tantque
  6. finpour
  7. // complexité en O(n) ?


 
Ca vous semble correct ?
Merci d'avance :)


Message édité par Pwill le 28-12-2006 à 18:29:10
Reply

Marsh Posté le 27-12-2006 à 21:27:43   

Reply

Marsh Posté le 28-12-2006 à 13:12:17    

pour la 2ème complexité, on peut améliorer l'estimation à O(ln(ln(n))).


Message édité par pains-aux-raisins le 28-12-2006 à 14:03:35
Reply

Marsh Posté le 28-12-2006 à 13:20:05    

la 3ème complexité est bien O(n)


Message édité par pains-aux-raisins le 28-12-2006 à 14:03:18
Reply

Marsh Posté le 28-12-2006 à 13:59:09    

pour la 1ere complexité, en déroulant l'aglorithme, on sent que O(n) n'est pas la bonne réponse. Ca serait plutôt O(n.ln(n))

Reply

Marsh Posté le 28-12-2006 à 16:32:13    

Je te remercie de ton aide :)
J'ai bien vu tes édits.  
Pour le 1er, je suis finalement d'accord pour du n.log(n).  
Pour ce qui est du second je suis pas contre du log(log(n)), mais je vois pas bien comment le sentir. Simplement parce que c'est plus petit que du log(n) ?

Reply

Marsh Posté le 28-12-2006 à 16:48:31    

pour la 2ème complexité, il faut partir de l'inégalité j<k dans la boucle tantque.
Si on pose i comme l'indice d'itération, on a j=2^(2^(i-1)) et k=n^i
En approximant j à 2^(2^i), il s'agit donc de résoudre 2^(2^i)/n^i < 1
Ce qui en faisant quelques transformations et approximations nous amène à i < log2(log2(n))

Reply

Marsh Posté le 28-12-2006 à 18:26:20    

pains-aux-raisins a écrit :

pour la 2ème complexité, il faut partir de l'inégalité j<k dans la boucle tantque.
Si on pose i comme l'indice d'itération, on a j=2^(2^(i-1)) et k=n^i
En approximant j à 2^(2^i), il s'agit donc de résoudre 2^(2^i)/n^i < 1
Ce qui en faisant quelques transformations et approximations nous amène à i < log2(log2(n))


Merci, je vois comment tu fais. En cours on n'est pas aussi précis, on ne précise même pas la base du log.

Code :
  1. i:=2
  2. tantque i<n faire
  3.    i:=i*i*i
  4. fin tantque


 
Pour celui là, si je me suis pas planté, on devrait trouver log3(log2(n)) ?

Message cité 1 fois
Message édité par Pwill le 28-12-2006 à 18:28:44
Reply

Marsh Posté le 28-12-2006 à 19:12:46    

non, tout simplement O(log2(n))
ou plus simplement O(ln(n))


Message édité par pains-aux-raisins le 28-12-2006 à 19:14:01
Reply

Marsh Posté le 03-01-2007 à 15:33:01    

Bonjour,
 
Moi aussi je révise les partiels.
J'avoue que je ne comprend pas grand choses à la complexité.
 
Quelle est la méthode pour résoudre cela ??
 
Beaucoup d'instinct je sais mais tout de meme ^^
 
Merci

Reply

Marsh Posté le 03-01-2007 à 17:15:43    

Euh, l'instinct pour calculer les complexité ???
Plutôt des maths oui !

Reply

Marsh Posté le 03-01-2007 à 17:15:43   

Reply

Marsh Posté le 03-01-2007 à 17:25:28    

Code :
  1. pour i allant de 1 à n par pas de 1 faire
  2.    j:=i;
  3.    tantque j>1 faire
  4.       j:=j/2
  5.    fin tantque
  6. finpour
 

Pour cet algo, je trouve : nlog(n)
Je sais que c'est pas ça :'(
Je ne sais pas comment faire !


Message édité par Shynia le 03-01-2007 à 17:25:58
Reply

Marsh Posté le 03-01-2007 à 17:47:41    

hmmm, imagine que tu a à la ligne 2, j:=n au lieu de j:=i.
tu obtiens donc une boucle tantque qui s'exécute en O(n).
Comme la boucle pour a n itération, on aurait une complexité de O(n²).
 
La question qu'on doit se poser maintenant c'est : "est-ce que le fait d'avoir j:=i au lieu de j:=n change quelque chose à la complexité de l'algo ?" => réponse non car on se rend compte que la complexité de cet algo revient à calculer somme(de 1 à n/2) = n(n/2+1)/4 qui implique donc une complexité de O(n²), CQFD

Reply

Marsh Posté le 03-01-2007 à 18:07:13    

C'est n'est pas plutot log2(n) dans le Tant Que, etant donné qu'on ne fais pas ca pour toutes les valeurs de n à 1 ??

Reply

Marsh Posté le 03-01-2007 à 18:37:18    

En regardant mon calcul, j'ai fait une erreur.
Dans tantque, si on pose k comme indice d'itération on doit résoudre j/2^k>1 <=> k < log2(j) donc une complexité en O(log2(n)).
Quand ensuite on passe avec la boucle pour, on observe un comportement amusant : Complexité = somme(log2(i), i=1..n) = somme(log2(n!))
La formule de stirling doit ensuite pouvoir donner une complexité de l'algo de l'ordre de O(ln(n))

Reply

Marsh Posté le 03-01-2007 à 19:09:42    

Merci beaucoup ^^
 
Il y a une question sur laquelle je seche fortement :
 

Code :
  1. j:=1;
  2. pour i allant de 1 à n par pas de 1 faire
  3.    tantque j<i*(n-i) faire
  4.       j:=j+1
  5.    fin tantque
  6. finpour


 
En posant comme indice k, on doit résoudre dans le tant que k<i*(n-i)  
Puis en passant de le pour on doit faire somme(i*(n-i) , i=1..n)...
Mais je suis vraiment pas sur. C'est comme ca qu'il faut proceder??

Reply

Marsh Posté le 03-01-2007 à 19:32:48    

Non, car ici j n'est initialisé qu'au début, à l'extérieur de la boucle pour.
Une petite simulation s'impose pour voir ce qu'il se passe.
Tu en induit une règle que tu dois en principe --- si on veut être rigoureux --- démontrer, le plus souvent par réccurence.

Reply

Marsh Posté le 03-01-2007 à 19:48:50    

Raahh minceeeee
Je comprend plus rien ^^

Reply

Marsh Posté le 03-01-2007 à 21:22:38    

Imaginons, n=100
j=1, i=1, i*(n-i)=99
j=2, i=1, i*(n-i)=99
...
j=99, i=1, i*(n-i)=99
j=99, i=2, i*(n-i)=196
j=100, i=2, i*(n-i)=196
...
j=196, i=2, i*(n-i)=196
j=196, i=3, i*(n-i)=291
...
j=291, i=3, i*(n-i)=291
...

 

Le maximum de i*(n-i) est atteint pour i=n/2 qui provoque également la fin de l'algorithme.
On constate que j est la variable d'itération et qu'il n'est pas nécessaire d'en introduire une nouvelle.

 

j a une progression linéaire et est même égal à i*(n-i) quand l'algo s'arrête. On a donc une complexité de O(n/2) soit O(n).

Message cité 1 fois
Message édité par pains-aux-raisins le 03-01-2007 à 21:36:19
Reply

Marsh Posté le 03-01-2007 à 22:58:06    

Zut, en fait je me plante sur les exemples de Shynia... et l'exam c'est demain aprem...  :sweat:  
Bon je reprend tout ca...

Reply

Marsh Posté le 03-01-2007 à 23:10:33    

pwill > quelle école/université ? quelle année ? si ce n'est pas indiscret

Reply

Marsh Posté le 03-01-2007 à 23:27:00    

pains-aux-raisins a écrit :

Imaginons, n=100
j=1, i=1, i*(n-i)=99
j=2, i=1, i*(n-i)=99
...
j=99, i=1, i*(n-i)=99
j=99, i=2, i*(n-i)=196
j=100, i=2, i*(n-i)=196
...
j=196, i=2, i*(n-i)=196
j=196, i=3, i*(n-i)=291
...
j=291, i=3, i*(n-i)=291
...
 
Le maximum de i*(n-i) est atteint pour i=n/2 qui provoque également la fin de l'algorithme.
On constate que j est la variable d'itération et qu'il n'est pas nécessaire d'en introduire une nouvelle.
 
j a une progression linéaire et est même égal à i*(n-i) quand l'algo s'arrête. On a donc une complexité de O(n/2) soit O(n).


 
 
 
Edit: j'ai effacé...  
Si je ne suis pas assez rigoureux pour bien faire tourner l'algo... je ne vais pas aller loin.
En fait j'ai pas détecté que l'arrêt de la boucle tant provoque l'arrêt de la boucle pour :sleep:  
 
Je suis d'accord que l'algo s'arrête à i = n/2. j est la variable d'itération.  
Du coup ce que je ne saisis pas, c'est pourquoi j ne serait pas la complexité de l'algo ?
A moins que je me trompe à nouveau en faisant tourner l'algo, je trouve j= (n/2)*(n-n/2)= n*n/4.  
On a n/2 passages dans la boucle pour, mais ces passages impliquent n*n/4 passages dans la boucle tant que, ce n'est pas ce qui importe pour la complexité ?  :pt1cable:  
 
 


Message édité par Pwill le 04-01-2007 à 00:35:40
Reply

Marsh Posté le 03-01-2007 à 23:29:02    

pains-aux-raisins a écrit :

pwill > quelle école/université ? quelle année ? si ce n'est pas indiscret


Bordeaux 1, 3ème année de licence Info :o
D'ailleurs tu ne devrais pas avoir de mal à trouver l'origine de ces exemples :p
 
Pour Shynia, j'imagine qu'il s'agit de la même université et du même cours  :ange:


Message édité par Pwill le 03-01-2007 à 23:34:45
Reply

Marsh Posté le 04-01-2007 à 00:37:05    

J'ai repris l'avant dernier message où j'avais écrit des bétises. J'ai corrigé mais il reste un point à éclaircir dans ma tête...
 
Bon quoi qu'il en soit, merci pour aide :jap:  
Et rien de grave si tu ne réponds pas d'ici demain midi, il est trop tard pour préparer un partiel  :ange:

Reply

Marsh Posté le 04-01-2007 à 12:48:45    

Ahh c'est beau les études d'info, enfin c'est mieux lorsque l'on a finit.
 
Qu'est ce que j'ai pu en bouffer des conneries comme ça...

Reply

Marsh Posté le 04-01-2007 à 12:50:07    

je serais curieux de savoir le nb d'ingé en infos qui, une fois dans la vie active, calculent encore la complexité de leurs algos...

Reply

Marsh Posté le 04-01-2007 à 12:55:46    

On est pas nombreux effectivement, mais l'expérience prime sur le calcul.
 
Une fois que tu t'es tappé pendant les études les différents coeff de chaque systèmes de tri, tu sais lesquels sont les plus complexes.

Reply

Marsh Posté le 04-01-2007 à 12:58:20    

certes, mais ça viendrait à l'idée d'aucun ingé d'utiliser le buble sort pour trier. De suite, il va partir sur le quick sort (même si c'est pas le plus performant) ; en +, on le trouve implémenté de base dans la plupart des langages de dév.

Reply

Marsh Posté le 04-01-2007 à 18:20:08    

bah, le calcul de la complexité a au moins le mérite de sensibiliser au problème. Et vu le nombre d'appli mal codée, je trouve même qu'une petite révision pour bcp d'ingé ne leur ferait pas de mal :o

Reply

Marsh Posté le 04-01-2007 à 18:28:31    

Le quick sort est utilisé par tout le monde même si une dicho pour le fun de temps en temps, ça fait pas de mal hehe !!
 
Sinon, il est clair que cela ne ferait pas de mal à certains mais bon tu saura avec le temps que le problème bien souvent est justement le ....temps.

Reply

Marsh Posté le 04-01-2007 à 18:55:15    

Merci pour la leçon angelx24, mais disons que je ne suis plus à l'école depuis longtemps ;)

Reply

Marsh Posté le 04-01-2007 à 19:03:44    

Et bien alors, tu sais que les programmeur sont fainéants de nature et que le temps manque pour la grande majorité des projets, cahiers des charges  etc... donc tu connais la musique du cycle en V.

Reply

Marsh Posté le 04-01-2007 à 19:25:50    

Si vous avez quelques minutes, vous pensez quoi de ces boucles:
 

Code :
  1. m:=1
  2. pour k allant de 1 a n par pas de 1 faire
  3.    i:= 1;
  4.    tant que i<k faire
  5.       i:=i*2;
  6.       m:=m*2;
  7.    fintantque
  8.    pour j allant de 1 a m par pas de 1 faire P(); finpour;
  9. finpour;
  10. // j'ai trouvé O(2^(n*log(n)), correct ?


Message édité par Pwill le 04-01-2007 à 19:41:02
Reply

Marsh Posté le 04-01-2007 à 19:33:26    

Pb à la ligne 2 : pas de borne max dans la boucle pour

Reply

Marsh Posté le 04-01-2007 à 19:40:27    

Désolé, 2 erreurs en recopiant le sujet  :sleep: J'ai édité.

Reply

Marsh Posté le 04-01-2007 à 20:48:19    

Pwill a écrit :

Merci, je vois comment tu fais. En cours on n'est pas aussi précis, on ne précise même pas la base du log.


 
Normal, elle n'a pas la moindre importance [:spamafote]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 22-06-2007 à 23:36:37    

clair, tu passe d'un log a l'autre par simple multiplication.
 
Si tu voulais preciser a ce point, il faudrait dire precision en a+b*n+c*n*log(n) etc . . .
 
on se contente dans cet exemple de n*log(n) qui est le facteur dominant des que n devient grand.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed