Complessità temporale di un algoritmo: è importante indicare la base del logaritmo?


Risposte:


63

Dipende da dove si trova il logaritmo. Se è solo un fattore, allora non fa differenza, perché big-O o θ ti consente di moltiplicare per qualsiasi costante.

Se prendi O(2logn) la base è importante. Nella base 2 avresti solo O(n) , nella base 10 è circa O(n0.3010) .


5
Immagino che questo avrà solo qualcosa come . Non riesco a vedere alcun motivo per esprimere un numero come2clogbnpiuttosto chen-to-qualunque-cosa-sia (tranne forse come uno stadio intermedio di un calcolo). 2logn2clogbnn
David Richerby,

7
+1 per "i fattori costanti contano negli esponenti"
Trognandro

50

Poiché la notazione asintotica ignora i fattori costanti e ogni due logaritmi differiscono per un fattore costante, la base non fa alcuna differenza: logan=Θ(logbn) per tutti a,b>1 . Quindi non è necessario specificare la base di un logaritmo quando si usa la notazione asintotica.


13
Preferisco vedere invece di ==
Nayuki

16
Temo che la notazione standard usi . =
Yuval Filmus,

4
@YuvalFilmus La notazione standard è fuorviante, completamente diversa da qualsiasi altro standard e rende la complessità algoritmica completamente estranea a cose abbastanza simili ad essa. "È la notazione standard" non dovrebbe mai essere una ragione per favorire una cattiva soluzione rispetto a una migliore, altrettanto chiara. (Il significato del simbolo è di solito chiaro dal contesto, comunque.)
wizzwizz4

7
@ wizzwizz4 La pratica comune è un motivo eccellente. Promuove una comunicazione efficiente. Questo è il motivo per cui tutti sopportiamo le stranezze dell'ortografia inglese.
Yuval Filmus,

3
A volte ha solo troppe cose lì per essere più chiare di log a n = Θ ( log b n ) . nloganΘ(nlogbn)logan=Θ(logbn)
JiK,

15

Come logxy=1logyx elogxy=logzylogzx , quindi loganlogbn=lognblogna=logablogaba,b>1logan=Θ(logbn)


8

Nella maggior parte dei casi, è sicuro abbandonare la base del logaritmo perché, come hanno sottolineato altre risposte, la formula del cambio di base per i logaritmi significa che tutti i logaritmi sono multipli costanti l'uno dell'altro.

Ci sono alcuni casi in cui questo non è sicuro da fare. Ad esempio, @ gnasher729 ha sottolineato che se si ha un logaritmo in un esponente, allora la base logaritmica è davvero significativa.

Volevo sottolineare un altro caso in cui la base del logaritmo è significativa, ed è in questi casi che la base del logaritmo dipende direttamente da un parametro specificato come input per il problema. Ad esempio, l'algoritmo di ordinamento radix funziona scrivendo i numeri in alcune basiB, decomponendo i numeri di input nella loro base-Bcifre, quindi utilizzando l'ordinamento di conteggio per ordinare quei numeri una cifra alla volta. Il lavoro svolto per round è quindiΘ(n+b) and there are roughly logbU rounds (where U is the maximum input integer), so the total runtime is O((n+b)logbU). For any fixed integer b this simplifies to O(nlogU). However, what happens if b isn't a constant? A clever technique is to pick b=n, in which case the runtime simplifies to O(n+lognU). Since lognU = logUlogn, the overall expression simplifies to O(nlogUlogn). Notice that, in this case, the base of the logarithm is indeed significant because it isn't a constant with respect to the input size. There are other algorithms that have similar runtimes (an old analysis of disjoint-set forests ended up with a term of logm/2+2 somewhere, for example), in which case dropping the log base would interfere with the runtime analysis.

Another case in which the log base matters is one in which there's some externally-tunable parameter to the algorithm that control the logarithmic base. A great example of this is the B-tree, which requires some external parameter b. The height of a B-tree of order b is Θ(logbn), where the base of the logarithm is significant in that b is not a constant.

To summarize, in the case where you have a logarithm with a constant base, you can usually (subject to exceptions like what @gnasher729 has pointed out) drop the base of the logarithm. But when the base of the logarithm depends on some parameter to the algorithm, it's usually not safe to do so.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.