Je passe en revue une notation Big O pour une interview et je rencontre ce problème.complexité temps simple O (nlogn)
for i = 1 to n do:
j = i
while j < n do:
j = 2 * j
simple droite? la boucle externe fournit n étapes. et chacune de ces étapes nous faisons une seule étape O (1) d'affectation j=i
puis log (n-j) ou log (n-i) depuis j = i
étape pour la boucle while. Je pensais que la complexité temporelle serait O (nlogn) mais la réponse est O (n).
voici la réponse:
La durée est à peu près la somme suivante: Σ 1 + log (n/i) pour i de 1 à n qui est Θ (n).
Maintenant ça fait longtemps que je suis un peu rouillé. d'où vient log(n/i)
? Je connais log(n) - log(i) = log(n/i)
mais je pensais que nous nous connectons (n-i) pas log (n) - log (i). et comment la complexité temporelle n'est-elle pas O (nlogn)? Je suis sûr qu'il me manque quelque chose de simple mais je regarde ça depuis des heures maintenant et je commence à perdre la tête.
source: ici est la source de ce problème Berkeley CS 170, Fall 2009, HW 1
modifier: après y avoir réfléchi un peu plus il est logique que la complexité temporelle de la boucle interne est log (n/i). Parce que chaque boucle interne s'exécute n-i fois mais je double chaque boucle. si la boucle interne commençait toujours à 0, nous avons log (n) mais prenons en compte le numéro de la boucle sur lequel nous n'avons pas à boucler, log (i). log (n) - log (i) qui est log (n/i).
Pour ajouter à la réponse fournie [Voir ici] (https: // mathématiques.stackexchange.com/questions/74412/how-to-show-sum-limits-i-1n-log-left-fracni-right-thetan) comment cette somme est O (n) – RSon1234
Merci @ RSon1234 c'est exactement ce que je suis à la recherche de! –