Faire “si” affectent à la fois l'analyse de la complexité?
Selon mon analyse, le temps d'exécution de cet algorithme doit être N2, parce que chacun des boucles de va une fois par le biais de tous les éléments. Je ne suis pas sûr de savoir si la présence de la if
modifications de la déclaration de la complexité du temps?
for(int i=0; i<N; i++){
for(int j=1; j<N; j++){
System.out.println("Yayyyy");
if(i<=j){
System.out.println("Yayyy not");
}
}
}
Le
Non, la dominante de l'opération est en cours d'impression.
comment tu sais que la dominante de l'opération?
Qu'entendez-vous par temps de course? Entendez-vous cela? Ou voulez-vous dire O?
Je veux juste dire que l'impression se produisent à chaque itération de la boucle.
if
est juste une déclaration; il ne pouvait qu'affecter le coefficient qui est perdu lors de l'utilisation de la notation de Landau. S est une limite supérieure sur l'asymptotique de la croissance, de toute façon.Non, la dominante de l'opération est en cours d'impression.
comment tu sais que la dominante de l'opération?
Qu'entendez-vous par temps de course? Entendez-vous cela? Ou voulez-vous dire O?
Je veux juste dire que l'impression se produisent à chaque itération de la boucle.
OriginalL'auteur FranXh | 2012-09-01
Vous devez vous connecter pour publier un commentaire.
Temps Total d'exécution sera Tc + N x (À + NxTi + N/2xTp).
Ce qui est égal à Tc + NxTo + (Nx(N/2)) x (2Ti + Tp) qui est délimitée par des K x (N^2) pour les valeurs de K > Ti + Tp/2 comme N va à l'infini. Cette limite fait de la complexité du temps encore O(N^2).
Non, le si déclaration ne change pas la complexité du temps dans cet exemple.
Le temps de la complexité est une mesure de la façon dont le temps d'exécution changements par rapport à la taille de saisie, ce n'est pas une mesure absolue de la course le temps lui-même. L'ajout de plus d'instructions conditionnelles à l'intérieur de cette boucle va certainement augmenter le temps d'exécution, mais le taux de temps d'exécution augmente avec le respect pour une entrée de taille N est toujours régie par O(N^2).
Merci pour la réponse & effacer mes doutes.
OriginalL'auteur Tugrul Ates
Pas. Considérer que le temps de la complexité décrit le temps asymptotiquement - nous absorber moins de temps-complexités dans le supérieur.
O(n²)
signifiek × n² + c
où il est supposé que lesc
est si faible que nous ne nous soucions pas.Ce sont les effets de constantes, un certain montant de frais généraux sur l'ensemble de la chose (c) et une certaine quantité de coût par quelle que soit sa complexité. Un
n²
algorithme va battre un autren²
algorithme si il a un moindrek
, ou si elles sont égales, une baisse de lac
. Aussi, O(n2) est la même que O(1) pour suffisamment faibles valeurs de n (et normalement, nous ne de soins, mais lak
de chacun pourrait être considérablement différent, et si nous le faisons chaque m fois, puis tout en O(n2m) bat O(m), si n est faible, ce n'est pas ce qui est vraiment contre)..De toute façon, c'est une volonté délibérée de simplification, parce que
k
etc
peut pas vraiment être constante, aussi bon que constante. Donc, si quelque chose était vraimentO(n² + log(n))
, nous préférons l'appelerO(n²)
, car qui se soucie que peu delog(n)
lorsque nous avons unn²
inquiéter?. En regardant votre cas. Nous faisons la boucle externe,
n
fois. Pour chacun de ceux-ci, nous faisons la boucle internen-1
fois. Pour chacune de ces boucles internes nous ne la première impression (tout écart dans les coûts n'est pas liée àn
en aucune manière, essentiellement constant) et le test. Le test réussit à peu près la moitié du temps, d'où le coût de la deuxième impression que souvent.De sorte que le coût total est:
De l'attribution des valeurs pour les constantes ci-dessus, nous obtenons:
Maintenant, depuis
c + d + e /2
est elle-même constante, qui peut devenir:Ou de commander à nouveau, dans l'ordre de plus haut ordre premier:
Si n est suffisamment élevé pour nous de donner une merde, alors n est proportionnellement si proche de n - 1 que l'on pourrait aussi bien considérer la même (un autre aspect de la complexité temporelle décrivant les choses à l'infini, c'est comme n approches ∞ et donc la différence entre n2 et (n × (n - 1)) sont proches de 0). Donc:
De nouveau, b + a est elle-même constante, il est donc équivalente à:
Et maintenant nous allons faire ce qui a été mentionné plus tôt que d'absorber la baisse des commandes en temps, qui se soucie de
n × c
, jamais l'esprit? Si n est suffisamment élevé pour que nous nous occupions à tous, il est tout au sujet den²
. À titre de comparaison, on peut simplement considérer la différence de l'ensemble des frais généraux comme le bruit et la traiter comme:Ou, en d'autres mots, comme:
Donc, oui, vous étiez bang sur elle pour commencer avec, et si l'instruction n'a pas d'incidence sur la complexité.
Considérant cela, on peut noter qu'il est possible que le temps de la complexité de masquer ce que nous nous soucions vraiment de. Si par exemple, nous avons eu un O(n2) de l'algorithme ont ce type d'analyse a permis de constater un coût de temps de
n² × k + n × c
étaient k s'élève à 200µs et c s'établit à 15 ans, puis jusqu'à ce que n est plus grand que 750000 c'est en fait le nombre n de bits que les coûts, plutôt que de le par-n2 bits. Au bas n c'est plus proche de ce que nous attendons de O(n) que de O(n2).La raison le temps de la complexité est utile, est une combinaison d'une si grande disparité étant rares, et que nous nous soucions de temps, et donc sur le temps-de la complexité, de plus lorsque n augmente (vous pouvez masquer certains horrible O(n!) monstruosité dans votre code que vous appeler une fois dans une lune bleue, avec trois éléments et tout simplement pas de soins). Donc, pour amener dans le monde réel des améliorations idéalement nous voulons réduire la complexité du temps, ou, à défaut, réduire le niveau le plus élevé de la constante k (ou en d'autres termes, si vous pouvez commencer à faire des choses n log n fois au lieu de n2 fois, puis les faire, sinon de réduire le coût de cette chose que vous faites n2 fois, plutôt que quelque chose que vous êtes en train de faire n fois).
En d'autres termes, il nous aide à nous concentrer sur ce que normalement mattres.
OriginalL'auteur Jon Hanna
Pas, le cas n'affecte pas la complexité.
OriginalL'auteur VoidStar
La complexité du temps est le même, vous aurez l'impression Yayyyy N^2 fois.
OriginalL'auteur Per Alexandersson
bien sûr, si vous travaillez avec une comparaison en fonction de l'algorithme, qui s ce u comte de droite?
donc dans votre cas, vous êtes à la recherche en O(n2), parce que si votre déclaration est en cours d'exécution presque n2 fois.
Pour les non comparaison des algorithmes de vous compter quelque soit votre opération principale.
O(n**2)
. Avis le texte en italique.OriginalL'auteur DarthVader
Réponse courte: le temps d'Exécution est toujours en O(N^2).
Réponse longue: Le coût de la réserve de vérification peut en toute sécurité être "ajouté" le poids de la println opération, le même que si au lieu de faire une println(), vous aviez deux println (). (À propos de l'exemple, l'ours à l'esprit que le coût des opérations d'e/S comme println emportent largement sur simple entier comparaisons.)
Peut-être que vous pourriez dire que la println() coûts des appels "1", et la comparaison est "0.0001 opération", de sorte que le coût total devrait être "(1.0001 * N)^2 opérations au lieu de simplement N^2. Vous avez également de réduire le nombre d'println()'s dans la moitié, de sorte que nous pouvons dire que vous êtes à (1.0001 * N) ^ 2 /2 opérations. C'est toujours en O(N^2), même si que pour une valeur donnée de N vous pouvez avoir réduit de moitié le moteur d'exécution par l'impression que la moitié des entrées.
En général, le coût de la comparaison doit être ajouté au coût des opérations au sein de la branche(es) résultant de la comparaison. Lorsque les deux if() {} else {} sont présents, il peut être plus difficile à mesure de l'exécution. Une tactique ici est d'estimer l'exécution si le plus cher de l'opération se produit chaque fois; ou, si l'exécution d'une seule branche n'est pas facilement trouvable, estimation, comme si les deux les opérations se produisent à chaque itération de boucle. Si ces opérations sont à la fois O(1), l'ordre d'exécution reste en O(N^2) puisque vous êtes mise à l'échelle linéaire.
(2N)^2
=4N^2
qui est encoreN^2
complexité.OriginalL'auteur lyngvi