2008-10-19 7 views
27

Pour les devoirs, on m'a donné les 8 fragments de code suivants pour analyser et donner une notation Big-Oh pour la durée de fonctionnement. Quelqu'un peut-il me dire si je suis sur la bonne voie?Big O Notation Devoirs - Analyse des algorithmes de fragment de code?

//Fragment 1 
for(int i = 0; i < n; i++) 
    sum++; 

Je pense O (N) pour le fragment 1

//Fragment 2 
for(int i = 0; i < n; i+=2) 
    sum++; 

O (N) pour le fragment 2 ainsi

//Fragment 3 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n; j++) 
     sum++; 

O (N^2) pour le fragment 3

//Fragment 4 
for(int i = 0; i < n; i+=2) 
    sum++; 
for(int j = 0; j < n; j++) 
    sum++; 

O (N) pour le fragment 4

//Fragment 5 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n * n; j++) 
     sum++; 

O (N^2) pour le fragment 5 mais le n * n me jetant un peu, donc je ne suis pas tout à fait sûr

//Fragment 6 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < i; j++) 
     sum++; 

O (N^2) pour le fragment 6 comme bien

//Fragment 7 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n * n; j++) 
     for(int k = 0; k < j; k++) 
      sum++; 

O (N^3) pour le fragment 7 mais encore une fois le n * n me secouer

//Fragment 8 
for(int i = 1; i < n; i = i * 2) 
    sum++; 

O (N) pour le fragment 8

+0

Je ne suis pas d'accord avec le commentaire "trop ​​localisé". Calculer Big-Oh est une partie centrale de l'analyse algorithmique. Exemples de codes spécifiques avec des estimations de Big-Oh peuvent être extrêmement précieux pour les gens qui essaient de parler couramment dans ce domaine. – JESii

Répondre

20

Je pense que le fragment 5 est O (n^3), et de même le fragment 7 est O (n^5) *. Il ressemble également à O (log (n)) pour le fragment 8.

Pour les problèmes n * n, vous devez exécuter le corps de la boucle n * n fois, donc ce serait O (n^2) , alors vous composez cela avec l'ordre de l'autre code. Fragment 8 double en fait le compteur au lieu de incrémenter, de sorte que le plus grand problème, le travail moins supplémentaire que vous avez à faire, il est donc O (log (n))

* edit: Fragment 7 est O (n^5), pas O (n^4) comme je le pensais précédemment. C'est parce que j et k vont de 1 à n * n. Désolé je n'ai pas attrapé ça plus tôt.

+0

oh d'accord, je vois ce que vous dites! Donc pour 5, le n * n signifie que le corps de la boucle interne sera exécuté de l'ordre de N^2 fois et composé avec l'ordre de N pour la boucle externe, globalement ce sera O (N^3). – VeePee

+0

même idée pour le fragment 7. Man le fragment 8 est allé complètement sur ma tête. Désolé si cela demande trop, mais je suis juste curieux de savoir à quoi ressemblerait le code de O (Nlog (N)) au cas où je le rencontrerais? – VeePee

+1

Pour un algorithme O (n * log (n)), imaginez une boucle externe qui compte de 1 à n et une boucle interne qui va de 1 à n en multipliant le compteur par 2 à chaque fois. Cependant, il est extrêmement inhabituel de rencontrer de tels algorithmes. Les algorithmes O (n * log (n)) les plus courants sont QuickSort et Merge Sort. –

0

Vous semblez être sur la bonne voie. En ce qui concerne le N * N, quel effet pensez-vous qu'il aurait? C'est un autre facteur de N donc ce serait probablement un ordre supérieur. Juste un avertissement, j'ai vu un autre message comme celui-ci et il a été voté extrêmement bas. Faites attention. Here est la publication.

+0

En fait, j'ai mis en doute la question, car il (1) a manifestement fait une tentative sérieuse pour résoudre les problèmes et (2) était honnête sur le fait qu'il s'agissait d'un devoir. – JesperE

+0

Oh, je suis tout à fait d'accord, c'est une tentative solide au problème et une question valide. Je veux juste l'avertir au cas où les autres réagiraient mal. Bien que dans ce cas il devrait aller bien. – smaclell

2

Pour 8 cas essayer d'écrire le nombre d'itérations pour certaines valeurs de N et de voir ce que le modèle ressemble ... il n'est pas O (N)

7

Fragment 7 est O (n^5) , pas O (n^4) comme le prétend le commentaire actuellement accepté. Sinon, c'est correct.

+0

Merci d'avoir attrapé cela –

+0

Bien sûr. C'est l'avantage d'un site collaboratif. –

0

Vous êtes sur la bonne voie, mais voici une astuce sur la façon dont les choses pourraient se clarifier en cours de route. Supposons que vous ayez du code:

for(i = 0; i < n; i++) { 
    for(j = 0; j < 100; j++){....} 
} 

À droite, tenez compte du fait que vous avez du code à différents niveaux.Dans cet exemple, vous ne pouvez voir 3 niveaux jusqu'à présent:

  1. L'extérieur de la boucle qui va de 0-n
  2. Une autre boucle pour qui 0-100
  3. Certains code à l'intérieur, cela est marqué comme ...

À aucun moment si vous essayez de calculer tout en 1 go. C'est là que la plupart des débutants font une sorte d'erreur arithmétique. Calculez-le individuellement pour chaque niveau, puis multipliez-le tous ensemble.

Bonne chance!