Une autre grande question de notation ... Quel est le Big O pour le code de folling: Mes pensées:
Donc, le casser, je pense que la boucle extérieure est question n ° 2:
Lors de la combinaison des boucles imbriquées, est-il toujours aussi simple que multirmploi le gros o de chaque boucle? p> p> O (log2 (n)) code>, puis chacune des boucles internes est
o (n) code> qui aboutirait à
O (n ^ 2 * log2 (n)) code> question n ° 1 est-ce correct? P>
4 Réponses :
logn code>, les deux autres sont n code> chacun, pour le total de O (n ^ 2 * logn ) code> li>
- Dans les cas simples, oui. Dans des cas plus complexes, lorsque les index de boucle commencent à des chiffres indiqués par d'autres index, les calculs sont plus complexes. LI>
ol>
Lorsque les compteurs de boucle ne dépendent pas de l'autre, il est toujours possible de travailler de l'intérieur vers l'extérieur. P>
La boucle la plus intérieure prend toujours le temps en O (n), car il boucle n fois quelles que soient les valeurs de i et j. P>
Lorsque la deuxième exécution de la boucle, il fonctionne pour O (N) d'itérations, chaque itération faisant O (n) pour exécuter le travail de la boucle la plus interne. Cela prend du temps O (n 2 sup>). P>
Enfin, lors de l'exécution de la boucle externe, il le fait en O (n 2 sup>) de travail par itération. Il fonctionne aussi pour O (log n) itérations, car il fonctionne égal au nombre de fois que vous devez diviser par deux n avant d'arriver à 1. Par conséquent, le travail total est O (n 2 sup> log n). p>
En général, vous ne pouvez pas simplement les boucles se multiplient ensemble, puisque leurs limites peuvent dépendre les uns des autres. Dans ce cas, cependant, car il n'y a pas de dépendance, les runtimes peuvent simplement être multipliées. Espérons que le raisonnement ci-dessus met en lumière les raisons pour lesquelles cela est - c'est parce que si vous travaillez à l'intérieur réflexion sur la quantité de travail chaque boucle fait et combien de fois il le fait, les runtimes finissent par obtenir multipliés ensemble p>.
J'espère que cela vous aidera! P>
Pour répondre légèrement (Remarque: légèrement) plus formellement, dire Ensuite, utilisez le théorème suivant: p>
si f 1 sub> (n) = O (g 1 sub> (n)) et f 2 sub> (n) = O (g < SUB> 2 SUB> (N)), puis F 1 SUB> (N) × F 2 SUB> (N) = O (G 1 SUB> (n) × g 2 sub> (n)) Cela nous laisse avec T (n) = O (n 2 sup> logn). p>
"Combiner des boucles imbriquées" n'est qu'une application de ce théorème. Le problème peut être en déterminant exactement combien d'opérations utilisées par chaque boucle, ce qui est simple. P> t (n) code> est l'heure (ou le nombre d'opérations) requis pour terminer l'algorithme. Ensuite, pour la boucle extérieure,
t (n) = journal n * t2 (n) code>, où
t2 (n) code> est le nombre d'opérations à l'intérieur em> la boucle (ignorer les constantes). De même, T2 (N) = N * T3 (N) = N * N. P>
(source et preuve) P>
blockQuote>
Vous pouvez procéder formellement à l'aide de la notation Sigma, pour imiter fidèlement vos boucles: P>
p>
1) Oui 2) Seulement si les boucles ne dépendent pas l'une de l'autre.
Vous pouvez les multiplier si elles sont indépendantes.