Complexité temporelle d'un algorithme: est-il important d'énoncer la base du logarithme?

Réponses:

63

Cela dépend où se trouve le logarithme. Si ce n'est qu'un facteur, cela ne fait aucune différence, car big-O ou θ vous permet de multiplier par n'importe quelle constante.

Si vous prenez O(2logn) la base est importante. Dans la base 2, vous auriez juste O(n) , dans la base 10, c'est environ O(n0.3010) .

gnasher729
la source
5
Je suppose que cela ne fera que quelque chose comme . Je ne vois aucune raison d'exprimer un nombre comme2clogbnplutôt quen-à-ce-que-ce-soit (sauf peut-être comme une étape intermédiaire d'un calcul). 2logn2clogbnn
David Richerby
7
+1 pour "les facteurs constants comptent dans les exposants"
trognanders
50

Parce que la notation asymptotique est inconsciente des facteurs constants et que deux logarithmes différents diffèrent par un facteur constant, la base ne fait aucune différence: logan=Θ(logbn) pour tout a,b>1 . Il n'est donc pas nécessaire de spécifier la base d'un logarithme lors de l'utilisation de la notation asymptotique.

Yuval Filmus
la source
13
Je préfère voir au lieu de ==
Nayuki
16
J'ai peur que la notation standard utilise . =
Yuval Filmus
4
@YuvalFilmus La notation standard est trompeuse, complètement différente de la norme partout ailleurs et rend la complexité algorithmique complètement étrangère à des choses assez similaires. «C'est la notation standard» ne devrait jamais être une raison de privilégier une mauvaise solution par rapport à une meilleure solution, tout aussi claire. (La signification du symbole est généralement claire du contexte, de toute façon.)
wizzwizz4
7
@ wizzwizz4 La pratique courante est une excellente raison. Il favorise une communication efficace. C'est la raison pour laquelle nous avons tous supporté les caprices de l'orthographe anglaise.
Yuval Filmus
3
Parfois, contient trop de choses pour être plus clair que log a n = Θ ( log b n ) . nloganΘ(nlogbn)logan=Θ(logbn)
JiK
15

Comme logxy=1logyx etlogxy=logzylogzx , donc loganlogbn=lognblogna=logab. Commelogabest une constante positive (pour touta,b>1), alorslogan=Θ(logbn).

OMG
la source
8

Dans la plupart des cas, il est prudent de supprimer la base du logarithme car, comme d'autres réponses l'ont souligné, la formule de changement de base des logarithmes signifie que tous les logarithmes sont des multiples constants les uns des autres.

Dans certains cas, cela n'est pas sûr. Par exemple, @ gnasher729 a souligné que si vous avez un logarithme dans un exposant, alors la base logarithmique est en effet significative.

Je voulais souligner un autre cas où la base du logarithme est significative, et c'est des cas où la base du logarithme dépend directement d'un paramètre spécifié en entrée du problème. Par exemple, l'algorithme de tri radix fonctionne en écrivant des nombres dans une base b , en décomposant les nombres d'entrée en leurs chiffres de base b , puis en utilisant le tri par comptage pour trier ces nombres un chiffre à la fois. Le travail effectué par tour est alors Θ(n+b) et il y a à peu près logbU tours (où U est l'entier d'entrée maximum), donc le temps d'exécution total est O((n+b)logbU)bO(nlogU)bb=nO(n+lognU)lognUlogUlognO(nlogUlogn)logm/2+2

bbΘ(logbn)b

Pour résumer, dans le cas où vous avez un logarithme à base constante, vous pouvez généralement (sous réserve d'exceptions comme ce que @ gnasher729 a signalé) supprimer la base du logarithme. Mais lorsque la base du logarithme dépend de certains paramètres de l'algorithme, il n'est généralement pas sûr de le faire.

templatetypedef
la source