12
votes

complexité de deux dépendants de boucles avec une boucle extérieure de la complexité de la logique

Le problème

Calcule la complexité de cet algorithme: xxx

Quoi que j'ai fait sur ce sujet avant: < / strong>

La première boucle fonctionne des heures de connexion. La deuxième boucle fonctionne à N-I fois avec I à partir de N et changeant à I / 2 dans chaque itération de la boucle extérieure. Donc, la boucle interne fonctionne comme ceci: xxx

et ainsi de suite sur

n - 1 fois < P> Le terme général est donc n * (((2 ^ n) -1) / (2 ^ n)

maintenant cette séquence n'est pas arithmétique ni géométrique. Donc, la formule de n / 2 * (A + L) ne peut pas être appliquée dessus. Comment procéder en outre à cette solution ou si c'est faux, quelle est la méthode correcte?

Remarque: si n / 2 * (A + L) est appliqué, La complexité résultante est -n / (2 ^ n) = O (2 ^ n).


4 commentaires

Lire: Quelle est la valeur de x en trimestre de n?


Il n'y a pas de x. Tu veux dire o (x)?


Comme n devient plus gros, l'approche de terme général n . Peut-être que c'est une solution.


Non x Je veux dire que je veux dire la question liée et essayer comme ceci: Un casse-tête liée aux boucles imbriquées


3 Réponses :


5
votes

D'abord les calculs xxx

Comme vous le voyez, j'ai attribué l'expression que vous souhaitez évaluer à A . À partir des deux dernières inégations, il suit la complexité de votre algorithme est thetha (n logn)

Ici, j'ai utilisé la progression géométrique bien connue de (1 + 1/2 + 1/4 + .....) = 2


4 commentaires

Comment avez-vous obtenu le terme n-n / 2 ^ logn dans la première étape? :)


J'ai compris! La déclaration sous la boucle extérieure ne fonctionne pas sur N-1 fois parce que la comparaison I> 1 sera fausse! Donc, il va courir une itération avant ces moments qui sont N-2 ^ déconnecteurs!


Comment avez-vous obtenu votre logement * N dans la deuxième étape et soustrayez-le de la série?


@ user2223421 Regardez la première étape: combien de termes vous avez? journal n . Chacun d'entre eux porte une valeur de n .



8
votes

Vous êtes sur la bonne voie. Comme vous l'avez mentionné, la boucle interne exécuterait journal n code> fois. Donc, le nombre total de fois qu'il exécute est le suivant:

    (n - n/2) + (n - n/4) + ... (log n) times
  = n*(log n) - (n/2 + n/4 + n/8 + ... up to 1)
  = n*(log n) - n*(1/2 + 1/4 + ...)
 <= n*(log n) - n because (1/2 + 1/4 + ...) is 1 even if we take all terms till infinity (G.P)
  = n(log n - 1), which is O(n*log(n))


12 commentaires

Comment avez-vous eu des horaires de connexion dans la première étape?


Puisque la boucle extérieure exécutera journal n fois ... aussi, (n + n / 2 + n / 4 + ... + jusqu'à 1) devra Soyez lognés N Times car le nombre de termes sera égal au nombre de pouvoirs de 2 . J'ai compris?


Oui :) La dernière boucle intérieure sera exécutée que je serai égale à logn!


@Harishakar Comment êtes-vous arrivé aux termes (n-n / 4), (n-n / 4) etc. dans la première étape?


@Harishankar Votre deuxième phrase dit "La boucle interne exécuterait la journal n fois".. Qu'est-ce que je rate?


@Harishankar parce que la boucle interne fonctionne à N-I fois et au début, je suis donc la boucle intérieure qui court N-N fois. Ensuite, le contrôle va à l'étape d'incrémentation et je suis divisé par 2 donc I est N / 2 ... alors la boucle interne fonctionne N-N / 2 fois (mise en termes générale N-i), etc.


@Harishakarand Ces termes sont ajoutés ensemble pour obtenir le nombre total de fois où la déclaration est exécutée.


@Harishankarso ... il devrait être n - logn la dernière fois que la boucle interne est exécutée? :)


@Geek Je pense que user2223421 a répondu à vos questions mais m'a tagué plutôt par erreur. Alors, après l'explication de l'utilisateur, est-ce clair maintenant?


@Harishankar oui il est clair maintenant..Je lisiez la boucle interne comme pour (j = 1; j au lieu de pour (j = i; j ... Par conséquent, j'ai été confus. Mon mauvais .... de toute façon +1 pour votre réponse.


@Harishankar pouvez-vous s'il vous plaît expliquer votre deuxième étape? Je suis confus, comment logn * n est sorti des supports


@ user2223421 (N - A1) + (N - A2) + (N - A3) ... 10 fois = 10 * N - (A1 + A2 + A3 + .. + A10) , droite ? De même manière, ici 10 est remplacé par journal n .



1
votes

Le non plus de fois que la déclaration est exécutée est nlogn - 2n (1-1 / 2 ^ logn)


1 commentaires

Pouvez-vous expliquer comment vous avez eu cette conclusion?