Complexidade temporal de um algoritmo: é importante declarar a base do logaritmo?

Respostas:

63

Depende de onde está o logaritmo. Se é apenas um fator, não faz diferença, porque big-O ou θ permite que você se multiplique por qualquer constante.

Se você usar O(2registron) , a base é importante. Na base 2 você teria apenas O(n) , na base 10 é sobre O(n0,3010) .

gnasher729
fonte
5
Eu acho que isso só vai aparecer com algo como . Não vejo razão para expressar um número como2clogbn emvez denpara o que quer que seja (exceto talvez como um estágio intermediário de um cálculo). 2registron2cregistrobnn
David Richerby
7
+1 para "fatores constantes são importantes em expoentes"
trognanders
50

Como a notação assintótica é alheia a fatores constantes, e quaisquer dois logaritmos diferem por um fator constante, a base não faz diferença: registrouman=Θ(registrobn) para todos uma,b>1 . Portanto, não há necessidade de especificar a base de um logaritmo ao usar notação assintótica.

Yuval Filmus
fonte
13
Eu prefiro ver vez de ==
Nayuki
16
Temo a notação utilizações comuns . =
Yuval Filmus
4
@YuvalFilmus A notação padrão é enganosa, completamente diferente da norma em qualquer outro lugar e faz com que a complexidade algorítmica pareça completamente estranha de coisas bastante semelhantes a ela. "É a notação padrão" nunca deve ser um motivo para favorecer uma solução ruim em detrimento de uma solução melhor e igualmente clara. (De qualquer maneira, o significado do símbolo é claro do contexto.)
wizzwizz4
7
@ wizzwizz4 A prática comum é um excelente motivo. Promove uma comunicação eficiente. Essa é a razão pela qual todos atendemos às peculiaridades da ortografia em inglês.
Yuval Filmus
3
Às vezes só tem muita coisa lá para ser mais claro do log um n = Θ ( log b n ) . nregistroumanΘ(nregistrobn)registrouman=Θ(registrobn)
JiK
15

Como registroxy=1registroyx eregistroxy=registrozyregistrozx , de modo registroumanregistrobn=registronbregistronuma=registroumab. Comoregistroumabé constante positiva (para todosuma,b>1), entãoregistrouman=Θ(registrobn).

AMD
fonte
8

Na maioria dos casos, é seguro descartar a base do logaritmo porque, como outras respostas apontaram, a fórmula de mudança de base para logaritmos significa que todos os logaritmos são múltiplos constantes um do outro.

Existem alguns casos em que isso não é seguro. Por exemplo, @ gnasher729 indicou que se você tiver um logaritmo em um expoente, a base logarítmica é realmente significativa.

Queria apontar outro caso em que a base do logaritmo é significativa, e é nesses casos que a base do logaritmo depende diretamente de um parâmetro especificado como entrada para o problema. Por exemplo, o algoritmo de classificação radix funciona escrevendo números em alguma base b , decompondo os números de entrada em seus dígitos da base b e usando a classificação de contagem para classificar esses números, um dígito por vez. O trabalho realizado por rodada é então Θ(n+b) e há aproximadamente registrobvocê rodadas (onde você é o número máximo de entradas máximo), portanto, o tempo de execução total é O((n+b)registrobvocê) . Para qualquer número inteiro fixob isso simplifica paraO(nregistrovocê) . No entanto, o que acontece seb não for uma constante? Uma técnica inteligente é escolherb=n ; nesse caso, o tempo de execução simplifica paraO(n+registronvocê) . Desderegistronvocê =registrovocêregistron , a expressão geral simplifica paraO(nregistrovocêregistron). Observe que, nesse caso, a base do logaritmo é realmente significativa porque não é uma constante em relação ao tamanho da entrada. Existem outros algoritmos que têm tempos de execução semelhantes (uma análise antiga de florestas desarticuladas terminou com um termo deregistrom/2+2algum lugar, por exemplo); nesse caso, largar a base de logs interferiria na análise de tempo de execução.

Outro caso em que a base de log é importante é aquele em que há algum parâmetro externo para o algoritmo que controla a base logarítmica. Um ótimo exemplo disso é a árvore B, que requer algum parâmetro externo b . A altura de uma árvore B da ordem b é Θ(registrobn) , onde a base do logaritmo é significativa, pois b não é uma constante.

Para resumir, no caso de você ter um logaritmo com uma base constante, geralmente você pode (sujeito a exceções como o que @ gnasher729 apontou) soltar a base do logaritmo. Mas quando a base do logaritmo depende de algum parâmetro do algoritmo, geralmente não é seguro fazê-lo.

templatetypedef
fonte