web-dev-qa-db-fra.com

Confusion Big O: log2 (N) vs log3 (N)

Pourquoi O (log2N) = O (log3N)?

Je ne comprends pas ça. Le grand O ne signifie-t-il pas la limite supérieure de quelque chose?

N'est pas connecté2N plus grand que le journal3N? Lorsque je les représente graphiquement, connectez-vous2N est au-dessus du log3N.

18
Daver Muzaffar

Big O ne gère pas les facteurs constants et la différence entre Logx(n) et journaly(n) est un facteur constant.

Pour le dire un peu différemment, la base du logarithme modifie simplement la pente d'une ligne/courbe sur le graphique. Big-O ne s'intéresse pas à la pente de la courbe sur le graphique, mais uniquement à la forme de la courbe. Si vous pouvez faire correspondre une courbe à une autre en déplaçant sa pente vers le haut ou vers le bas, alors en ce qui concerne la notation Big-O, ce sont la même fonction et la même courbe.

Pour essayer de mettre cela en perspective, un dessin de certaines des formes de courbes les plus courantes serait peut-être utile:

enter image description here

Comme indiqué ci-dessus, seule la forme d'une ligne est importante, pas sa pente. Dans la figure suivante:

enter image description here

... toutes les lignes sont droites, donc même si leurs pentes diffèrent radicalement, elles sont toutes identiques en ce qui concerne le big-O - elles sont toutes juste O (N), quelle que soit la pente. Avec les logarithmes, nous obtenons à peu près le même effet - chaque ligne sera incurvée comme la ligne O (log N) dans l'image précédente, mais changer la base du logarithme fera tourner cette courbe autour de l'origine afin que vous (encore) avoir la même forme de ligne, mais à des pentes différentes (donc, encore une fois, en ce qui concerne le big-O, ils sont tous identiques). Donc, pour en revenir à la question d'origine, si nous changeons les bases des logarithmes, nous obtenons des courbes qui ressemblent à ceci:

enter image description here

Ici, il peut être un peu moins évident que tout ce qui se passe est un changement constant de la pente, mais c'est exactement la différence ici, tout comme avec les lignes droites ci-dessus.

31
Jerry Coffin

C'est parce que changer la base des logarithmes équivaut à la multiplier par une constante. Et le grand O ne se soucie pas des constantes.

log_a(b) = log_c(b) / log_c(a)

Donc, pour passer de log2(n) à log3(n) vous devez le multiplier par 1 / log(3) 2.

En d'autres termes log2(n) = log3(n) / log3(2).

log3(2) est une constante et O(cn) = O(n), donc O (log2(n)) = O (log3(n))

14
luk32

Il y a déjà de bonnes réponses ici, alors lisez-les également. Pour comprendre pourquoi Log2 (n) est O(log3(n)), vous devez comprendre deux choses.

1) Que signifie la notation BigO. Je suggère de lire ceci: http://en.wikipedia.org/wiki/Big_O_notation Si vous comprenez cela, vous saurez que 2n Et 16n+5 Sont tous les deux O(N)

2) comment fonctionnent les logarithmes. la différence entre log2 (N) et connectez-vousdix(N) sera un rapport simple, facilement calculé si vous le souhaitez selon la réponse de luk32.

Étant donné que les journaux à différentes bases ne diffèrent que par un rapport constant et que Big O est indifférent aux choses mineures comme les facteurs de multiplication constants, vous trouverez souvent O(logN) omet en fait la base, car le le choix de toute base constante (par exemple 2,3,10, e ) ne fait aucune différence dans ce contexte.

2
RichardPlunkett

Cela dépend du contexte dans lequel la notation O est utilisée. Lorsque vous l'utilisez dans un raisonnement de complexité algorithmique, vous êtes intéressé par le comportement asymptotique d'une fonction, c'est-à-dire comment elle croît/diminue lorsqu'elle tend vers (plus ou moins) l'infini (ou un autre point d'accumulation) .

Par conséquent, alors que f(n) = 3n est toujours inférieure à g(n) = 1000n, ils apparaissent tous les deux dans O(n) car ils croissent linearly (selon leurs expressions) asymptotiquement.

Le même modèle de raisonnement peut être utilisé pour le cas de logarithme que vous avez publié, car les logarithmes de bases différentes diffèrent pour un facteur constant, mais partagent le même comportement asymptotique.

En changeant de contexte, si vous étiez intéressé à calculer les performances exactes d'un algorithme étant donné que vos estimations sont exactes et non approximatives, vous préféreriez bien sûr la plus basse. En général, toutes les comparaisons de complexité de calcul sont des approximations ainsi effectuées via un raisonnement asymptotique.

1
rano