Mon professeur vient de nous apprendre que toute opération qui divise par deux la longueur de l'entrée présente une complexité O(log(n)) comme règle du pouce. Pourquoi n'est-ce pas O (sqrt (n)), les deux ne sont-ils pas équivalents?
Ils ne sont pas équivalents: sqrt (N) augmentera beaucoup plus que log2(N). Il n'y a pas de constante C pour que vous ayez sqrt (N) <C.log (N) pour toutes les valeurs de - N supérieur à une valeur minimale.
Un moyen facile de saisir ceci, est que log2(N) sera une valeur proche du nombre de chiffres (binaires) de N , tandis que sqrt (N) = sera un nombre qui a lui-même la moitié du nombre de chiffres que N . Ou, pour déclarer cela avec une égalité:
bûche2(N 2log2(sqrt (N))) ==
Il faut donc prendre le logarithme (!) De sqrt (N) pour le ramener au même ordre de complexité que log2(N).
Par exemple, pour un nombre binaire de 11 chiffres, 0b10000000000 (= 2dix), la racine carrée est 0b100000, mais le logarithme n’est que 10.
En supposant que natural logarithm
(Sinon multipliez simplement par une constante), nous avons
lim {n->inf} log n / sqrt(n) = (inf / inf)
= lim {n->inf} 1/n / 1/(2*sqrt(n)) (by L'Hospital)
= lim {n->inf} 2*sqrt(n)/n
= lim {n->inf} 2/sqrt(n)
= 0 < inf
Reportez-vous à https://en.wikipedia.org/wiki/Big_O_notation pour la définition alternative de O(.)
et, de ce fait, par le haut, nous pouvons dire log n = O(sqrt(n))
,
Comparez également la croissance des fonctions ci-dessous, log n
Est toujours délimité par le haut de sqrt(n)
pour les grands n
.
Non, ce n'est pas équivalent.
@trincot a donné une excellente explication avec un exemple dans sa réponse. J'ajoute un autre point. Votre professeur vous a appris que
any operation that halves the length of the input has an O(log(n)) complexity
C'est aussi vrai que,
any operation that reduces the length of the input by 2/3rd, has a O(log3(n)) complexity
any operation that reduces the length of the input by 3/4th, has a O(log4(n)) complexity
any operation that reduces the length of the input by 4/5th, has a O(log5(n)) complexity
So on ...
C'est même vrai pour toute réduction de longueur de l'entrée de (B-1)/Bth.
Il a alors une complexité de O(logB(n))
N:B:
O(logB(n))
signifie B
logarithme basé sur n
Non, ils ne sont pas équivalents; vous pouvez même le prouver
O(n**k) > O(log(n, base))
pour tout k > 0
et base > 1
(k = 1/2
dans le cas de sqrt
).
Lorsque nous parlons sur O(f(n))
, nous souhaitons étudier le comportement de large n
, limites est un bon moyen pour cela. Supposons que les deux gros O
soient équivalents:
O(n**k) = O(log(n, base))
ce qui signifie qu'il y a une certaine constante finie C
telle que
O(n**k) <= C * O(log(n, base))
à partir de quelque chose d'assez gros n
; mettez-le en d'autres termes (log(n, base)
n'est pas 0
à partir d'un grand n
, les deux fonctions sont continuellement différentiables):
lim(n**k/log(n, base)) = C
n->+inf
Pour connaître la valeur de la limite, nous pouvons utiliser règle de L'Hospital , c'est-à-dire prendre des dérivées pour le numérateur et le dénominateur et les diviser:
lim(n**k/log(n)) =
lim([k*n**(k-1)]/[ln(base)/n]) =
ln(base) * k * lim(n**k) = +infinity
nous pouvons donc en conclure qu'il n'y a pas de constante C
telle que O(n**k) < C*log(n, base)
ou autrement dit
O(n**k) > O(log(n, base))
Non ce n'est pas. Lorsque nous traitons avec la complexité du temps, nous pensons que l'entrée est un très grand nombre. Alors prenons n = 2 ^ 18. Maintenant pour sqrt (n) le nombre d'opération sera 2 ^ 9 et pour log (n) il sera égal à 18 (nous considérons log avec la base 2 ici). Il est clair que 2 ^ 9 est beaucoup plus grand que 18. On peut donc dire que O (log n) est plus petit que O (sqrt n).