Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Complexité

Posté par
Alicia123
14-09-13 à 15:40

Bonjour,

Combien de fois, en fonction de n, cette fonction affiche la lettre "X".


Merci d'avance

Posté par
Alicia123
re : Complexité 14-09-13 à 15:42

Bon visiblement j'ai mal attaché la fonction.

Complexité

Posté par
LeDino
re : Complexité 14-09-13 à 16:00

Première double boucle :

i varie de 1 à n
   j varie de 0 à 1,  donc 2 X
   j varie de 0 à 3,  donc 4 X
   j varie de 0 à 5,  donc 6 X
   ...
   j varie de 0 à 2i-1,  donc 2i "X"
   ...
   j varie de 0 à 2n-1,  donc 2n "X"

Donc X est affiché :   \sum _{i=1} ^{n} 2i  =  2 \sum _{i=1} ^{n} i  =  n.(n+1)

Deuxième double boucle :

Il y a un "piège", car le PUTCHAR("X") n'est pas dans la sous-boucle sur j.
Il faut donc compter la simple boucle sur i...

i varie de 1 à n, donc n "X".

Au total :  N = n.(n+2)

Posté par
LeDino
re : Complexité 14-09-13 à 16:00

... à vérifier par toi même bien sûr ...

Posté par
Alicia123
re : Complexité 15-09-13 à 01:45

Merci pour la réponse, j'ai toutefois une question. L'exercice suivante me semble quasiment identique.

Si à la place de la boucle for j'avais la boucle while de la façon suivante:

for (i=1; i<(n-1); i++) {
  j=i-1
  while ( j>=0) do
  {
     put("X");
     i--;
  }
}

Aurais je même résultat?

Posté par
Alicia123
re : Complexité 15-09-13 à 01:48

La première ligne de la fonction est for (i=1; i<=(n-1); i++) { et non for (i=1; i<(n-1); i++) {

Posté par
LeDino
re : Complexité 15-09-13 à 03:36

Citation :
for (i=1 ; i<=(n-1) ; i++)
  {  j = i-1
     while ( j>=0 ) do  {put("X"); i--; }
  }

Je ne connais pas vraiment le langage (du C ou du JAVA... ?).
Mais j'ai quand même l'impression qu'on s'attend à avoir j-- à l'intérieur du WHILE... Non ?

Donc plutôt ceci :
Citation :
for (i=1 ; i<=(n-1) ; i++)
  {  j = i-1
     while ( j>=0 ) do  {put("X"); j--; }
  }

Si c'est le cas, alors on a ici :

i varie de 1 à n-1
  j varie de 0 à 0     donc  1  "put X"
  j varie de 1 à 0     donc  2  "put X"
  j varie de 2 à 0     donc  3  "put X"
  ...
  j varie de i-1 à 0   donc  i  "put X"
  ...
  j varie de n-1 à 0   donc  n  "put X"

Au total :  N = n.(n+1)/2

Posté par
Alicia123
re : Complexité 15-09-13 à 05:13

En fait il s'agit partiellement du tri insertion que j'ai essayé de traduire en JAVA, c'est un peu raté...

Je ne comprends pas le résultat final:

pour la boucle j
on a j varie de n-1 à 0   donc  n  "put X"
donc somme de j pour j allant de 0 à n-1
donc ((n-1)(n-1 +1))/2 = n(n-1) / 2

pour la i
on a i qui varie de 1 à n-1
donc (n-2)

donc au total:
n(n-1)(n-2) / 2

Où est ce que je me suis trompé?

Posté par
LeDino
re : Complexité 15-09-13 à 05:47

Citation :
Où est ce que je me suis trompé ?


Je ne sais pas.
J'ignore d'ailleurs de quel code tu parles : le premier ou le dernier.
Et tu n'as pas confirmé pour l'erreur supposée sur l'indice j.
Donc si tu veux, ton calcul là ...

Regarde plutôt mon calcul... et dis-moi où moi je me suis trompé ...

Posté par
LeDino
re : Complexité 15-09-13 à 05:49

Et de toutes manières il n'y a jamais 3 boucles imbriquées...
Donc peu d'espoir d'avoir une formule d'ordre 3.

Tu ne crois pas ?

Posté par
Alicia123
re : Complexité 15-09-13 à 21:43

Oui tu avais raison pour la boucle, la fonction que tu avais réécrit était bonne.
Pour mon calcul, je suis partie de ton raisonnement: en supposant i varie de 1 à n-1 et  j varie de n-1 à 0   donc  n  "put X" (comme tu l'avais dit) mais je n'ai pas réussi à trouver  N = n.(n+1)/2 en résultat final mais plutôt n(n-1)(n-2) / 2 .


En fait il s'agissait de trouver le nombre maximal et minimal de comparaison entre éléments du tableau (donc le nombre de fois où l'instruction de la ligne 5 est exécuté) pour le tri insertion ci dessous.

J'ai fait le rapprochement entre les deux exercice donc j'ai supposé que le résultat serait identique à celle de boucle.

Complexité

Posté par
Alicia123
re : Complexité 15-09-13 à 23:28

Je viens de recalculer, je pense que ce serait

somme de i pour i allant de 0 à (n-1) = ((n-1)n) / 2  non?

Posté par
LeDino
re : Complexité 16-09-13 à 01:13

Citation :
Je viens de recalculer, je pense que ce serait somme de i pour i allant de 0 à (n-1) = ((n-1)n) / 2  non ?

Je ne sais même pas de quel code tu parles ...
Tu ne pourrais pas faire un effort quand tu formules tes questions ?
C'est carrément dur de suivre ta démarche : la confusion de tes énoncés rajoute une complexité superflue.
Non seulement tu crées un risque de malentendu, mais de surcroit c'est carrément grossier pour tes interlocuteurs car tu leur fait perdre du temps...

Si tu parles du tout dernier code "SERTIONSORT", j varie de 1 à n-1 en boucle principale, puis i varie de j-1 à 0 dans le pire des cas, donc somme de j pour j allant de 1 à n-1, donc N = n(n-1)/2.

Sauf qu'ici la boucle While imbriquée admet une condition sur A(i) et que le calcul des itérations est plus complexe...
L'algorithme ressemble à un tri à bulle.
Dans ce cas, la complexité serait approximativement en n²/4, selon la répartition du tableau à trier.

A vérifier...

Posté par
LeDino
re : Complexité 16-09-13 à 14:35

Rectificatif et précision :

Le code que tu as présenté en dernier réalise un TRI PAR INSERTION.
Sa performance est à peu près équivalente à celle du TRI A BULLE.

Au pire, comme je l'ai dit, si tu parcours la boucle intérieure systématiquement (parce que la deuxième condition (A(i)>key) est systématiquement vraie...), alors la complexité sera en n(n-1)/2...  La boucle intérieure sera exécutée systématiquement si le tableau est trié "à l'envers" au départ. C'est un cas extrême qui n'arrive presque jamais (le "pire cas").

De même et réciproquement, la boucle intérieure peut ne jamais être exécutée (deuxième condition jamais vraie). Dans ce cas, également extrême, et donc également "rare", la complexité sera en  n-1...  Ce cas correspond à un tableau déjà trié dans le bon ordre (le "meilleur cas").

Dans le cas général, la boucle sera exécutée "en moyenne" une fois sur deux. Parce que grosso modo, deux nombres pris au hasard dans le tableau de départ, ont la même chance d'être "le plus grand des deux"... ce qui implique une probabilité 1/2 pour la boucle intérieure de s'exécuter.

Au final, pour un tableau ordonné aléatoirement, il y a donc en moyenne une complexité de l'ordre de  n²/4  (la moitié du pire cas).

Posté par
Alicia123
exercice complexité tri insertion 22-09-13 à 20:49

Bonjour,

Quelqu'un pourrait confirmer ma résolution de l'exercice ci dessous?

Cet algorithme utilise deux comparaisons différentes. Il y a i > 0, qui est toujours une comparaison d'entiers (donc toujours effectuée en temps constant), et A[i] > key qui compare les éléments stockés dans le tableau, et dont la complexité dépend de la nature de ces éléments (entiers, chaînes de carac- tères, enregistrements de base de données, etc.). Par la suite, nous ne nous intéressons qu'à ces dernières comparaisons, entre les éléments du tableau.

On note n la taille du tableau A, dont les indices vont de 0 à n − 1.

1. Quel est le nombre maximal de comparaisons (entre éléments du tableau) effectuées par INSERTIONSORT ? Donnez une réponse précise en fonction de n.

2. Quel est le nombre minimal de comparaisons (entre éléments du tableau) effectuées par INSERTIONSORT ? Donnez une réponse précise en fonction de n.

3. Quelle est la complexité de INSERTIONSORT dans le pire cas, lorsque les éléments à trier sont des entiers ?

4. Étant donné deux chaînes de n caractères, quel est la complexité de l'algorithme qui com- pare les deux chaînes pour décider laquelle vient avant l'autre dans l'ordre alphabétique ? (C'est la fonction strcmp() en C.)

5. Déduisez-en la complexité de INSERTIONSORT dans le pire cas, lorsque le tableau contient n chaînes de caractères de taille n à trier dans l'ordre alphabétique.



Voici mes réponses:

1) somme de i pour i allant de 0 à (n-1) = ((n-1)n) / 2.

2) dans le pire le tableau est trié donc A[i]>key n'est jamais valide donc le nombre minimal de comparaison est n.

3) la ligne 2, 3 et 7 seront exécuté n fois
la boucle est exécuté, dans le pire cas, ((n-1)n) / 2 fois
donc en somme 3n + ((n-1)n) / 2 fois
j'en déduit que la complexité est de Θ(n^2)

4) je compare chaque caractère de même indice donc la complexité est en Θ(n)

5) la boucle est exécuté ((n-1)n) / 2 fois
la complexité de strcmp est Θ(n)
la complexité des instructions sont en Θ(1)
donc complexité de insertionSort avec strcmp est de Θ((n-1)n) / 2 max(Θ(n), Θ(1)) = Θ(n^3)


Merci d'avance

exercice complexité tri insertion

*** message déplacé ***

Posté par
jeveuxbientaider
re : exercice complexité tri insertion 23-09-13 à 22:27

Bonjour,

Sais tu que le multipost = poster plusieurs fois le même sujet est interdit ici ?

Trois fois c'est beaucoup....

*** message déplacé ***



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !