Les paramètres de la complexité

Les paramètres de la complexité - Algo - Programmation

Marsh Posté le 16-02-2010 à 12:24:24    


Bonjour,
 
Pou évaluer la complexité théorique d'un algorithme, est ce que on utilise seulement les paramètres qui sont les entrées de l'algorithme ?
 
Est ce que on peut trouver dans la valeur de la complexité des paramètres qui sont calculés dans l'algorithme ?
 
En général, comment on évalue la complexité théorique d'un algorithme?
 
Merci.

Reply

Marsh Posté le 16-02-2010 à 12:24:24   

Reply

Marsh Posté le 17-03-2010 à 18:37:59    

Salut
 

msedirim a écrit :


Pou évaluer la complexité théorique d'un algorithme, est ce que on utilise seulement les paramètres qui sont les entrées de l'algorithme ?


 
Qu'est ce que tu entends par ça ? Tu veux parler d'algorithmes avec effets de bord ?
 

msedirim a écrit :


Est ce que on peut trouver dans la valeur de la complexité des paramètres qui sont calculés dans l'algorithme ?


 
A priori je dirai non, mais je crois que je ne comprend pas bien ta question. (c'est quoi ce que tu appelles la complexité ? et c'est quoi ta définition d'un paramètre calculé ?)
 

msedirim a écrit :


En général, comment on évalue la complexité théorique d'un algorithme?


 
Un outil très utilisé en algorithmique est l'ordre de l'algorithme. Il vise à déterminer le temps de calcul (en nombre d'opération) d'un algorithme en fonction de ses arguments. Pour déterminer l'ordre d'un algorithme, on construit à partir de son code le polynome de coût correspondant et on en prend le terme le plus élevé.
 
Par exemple, pour le code:

Code :
  1. int sum(int upBound) {
  2.     int result = 0;
  3.     for(int i = 1; i <= upBound; i++)
  4.         result += i;
  5. }


 
On détermine la complexité en calculant le nombre d'itérations réalisées: il y en a upBound
Opérations = upBound
C'est un polynome de degrés 1, on dit qu'il est d'ordre O(x)
 
Maintenant, si je rajoute une boucle imbriquée,  

Code :
  1. int sum2(int upBound) {
  2.     int result = 0;
  3.     for(int i = 1; i <= upBound; i++)
  4.         for(int j = 1; j <= upBound; j++)
  5.             result += i;
  6. }


 
On obtient un nombre d'opérations = upBound^2, on dit qu'il est d'ordre O(x^2)
 
A partir de ces deux fonctions, je peux calculer la complexité de l'algorithme qui consiste à exécuter sum suivi de sum2; le nombre d'opération effecté est la somme du nombre d'opérations effectuées dans chaque fonction = upBound + upBound^2
La complexité est alors d'ordre O(x^2). On écarte le terme en O(x) car il est négligeable devant le terme en O(x^2) lorsque x tend vers l'infini.
 
Enfin, je peux directement déduire de ces valeurs la complexité du calcul sum(sum2(upBound)), c'est le produit des complexités des deux algorithmes:
Le nombre d'opérations = upBound * upBound^2 = upBound^3
On a donc un algorithme d'ordre O(x^3)
 
C'est une méthode qui donne un bon aperçu de la performance d'un algorithme pour des valeurs infinies.  
En effet, si tu prends des valeurs de taille finie, il sera sans doutes préférable d'avoir un algorithme effectuant x + 0.00001x^5 opérations (ordre O(x^5)) qu'un algorithme "optimisé" effectuant x^2 opérations (ordre O(x^2) ) car le terme en x^5 sera négligeable par rapport au terme en x.

Reply

Marsh Posté le 18-03-2010 à 09:31:53    

Reply

Marsh Posté le 18-03-2010 à 09:41:05    


 

Citation :

Les algorithmes usuels peuvent être classés en un certain nombre de grandes classes de complexité.
 
Les algorithmes sub-linéaires, dont la complexité est en général en O(log n). C'est le cas de la recherche d'un élément dans un ensemble ordonné fini de cardinal n.
 
Les algorithmes linéaires en complexité O(n) ou en O(nlog n) sont considérés comme rapides, comme l'évaluation de la valeur d'une expression composée de n symboles ou les algorithmes optimaux de tri.
 
Plus lents sont les algorithmes de complexité située entre O(n2) et O(n3), c'est le cas de la multiplication des matrices et du parcours dans les graphes.
 
Au delà, les algorithmes polynomiaux en O(nk) pour k > 3 sont considérés comme lents, sans parler des algorithmes exponentiels (dont la complexité est supérieure à tout polynôme en n) que l'on s'accorde à dire impraticables dès que la taille des données est supérieure à quelques dizaines d'unités.
La recherche de l'algorithme ayant la plus faible complexité, pour résoudre un problème donné, fait partie du travail régulier de l'informaticien. Il ne faut toutefois pas tomber dans certains excès, par exemple proposer un algorithme excessivement alambiqué, développant mille astuces et ayant une complexité en O(n1,99), alors qu'il existe un algorithme simple et clair de complexité O(n2). Surtout, si le gain de l'exposant de n s'accompagne d'une perte importante dans la constante multiplicative: passer d'une complexité de l'ordre de n2/2 à une complexité de 1010 n log n n'est pas vraiment une amélioration.


 
Je vois pas trop en quoi ca diffère de ce que j'ai dis  :o

Reply

Marsh Posté le 14-06-2010 à 08:28:18    

leo++ a écrit :


Je vois pas trop en quoi ca diffère de ce que j'ai dis  :o


 
j'ai répondu avant de voir ta réponse, c'ets l'OP qui me faisait saigner des yeux

Reply

Sujets relatifs:

Leave a Replay

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