Para o tipo de árvore de pesquisa binária de estruturas de dados, vejo que a notação Big O é normalmente indicada como O (logn). Com um 'l' minúsculo em log, isso implica log de base e (n) conforme descrito pelo logaritmo natural? Desculpe pela pergunta simples, mas sempre tive problemas para distinguir entre os diferentes logaritmos implícitos.
math
binary-tree
complexity-theory
big-o
BuckFilledPlatypus
fonte
fonte
log n
ele se refere ao logaritmo natural. 2. Quando um cientista da computação escreve,log n
ele se refere à base dois. 3. Quando um engenheiro escreve,log n
ele quer dizer base dez. Isso geralmente é verdade.Respostas:
Uma vez expresso na notação big-O (), ambos estão corretos. Porém, durante a derivação do polinômio O (), no caso da busca binária , apenas o log 2 está correto. Presumo que essa distinção foi a inspiração intuitiva para sua pergunta para começar.
Além disso, na minha opinião, escrever O (log 2 N) é melhor para o seu exemplo, porque comunica melhor a derivação do tempo de execução do algoritmo.
Na notação big-O (), os fatores constantes são removidos. A conversão de uma base de logaritmo para outra envolve a multiplicação por um fator constante.
Portanto, O (log N) é equivalente a O (log 2 N) devido a um fator constante.
No entanto, se você pode digitar facilmente log 2 N em sua resposta, isso é mais pedagógico. No caso de pesquisa em árvore binária, você está correto ao dizer que log 2 N é introduzido durante a derivação do tempo de execução big-O ().
Antes de expressar o resultado como notação big-O (), a diferença é muito importante. Ao derivar o polinômio a ser comunicado por meio da notação big-O, seria incorreto para este exemplo usar um logaritmo diferente de log 2 N, antes de aplicar a notação O () -. Assim que o polinômio é usado para comunicar um tempo de execução de pior caso por meio da notação big-O (), não importa qual logaritmo é usado.
fonte
log_2 n
valeΘ(log_a n)
para qualquer basea
, então não tenho certeza se vejo como usar a base 2 é "mais correto".A notação Big O não é afetada pela base logarítmica, porque todos os logaritmos em bases diferentes estão relacionados por um fator constante ,
O(ln n)
é equivalente aO(log n)
.fonte
log_2 x
Difere delog_b x
por um fator constantec(b)
para qualquer baseb
independente dex
.log_2 n
, posso simplesmente entrar e substituir tudolog_2 n
porlog_pi 2 * log_2 n / log_pi 2
e, então, terminar com uma análise que envolve tudolog_pi 2 * log_pi n
. Agora minha análise é em termos delog_pi n
.Na verdade, não importa que base seja, uma vez que a notação big-O geralmente é escrita mostrando apenas a ordem assintoticamente mais alta de
n
, então os coeficientes constantes diminuirão. Como uma base de logaritmo diferente é equivalente a um coeficiente constante, ela é supérflua.Dito isso, provavelmente assumirei a base de log 2.
fonte
Ambos estão corretos. Pense sobre isso
fonte
Sim, ao falar sobre a notação big-O, a base não importa. No entanto, computacionalmente, quando confrontado com um problema de pesquisa real, isso importa.
Ao desenvolver uma intuição sobre estruturas de árvore, é útil entender que uma árvore de pesquisa binária pode ser pesquisada em tempo O (n log n) porque essa é a altura da árvore - ou seja, em uma árvore binária com n nós, a árvore a profundidade é O (n log n) (base 2). Se cada nó tiver três filhos, a árvore ainda pode ser pesquisada em tempo O (n log n), mas com um logaritmo de base 3. Computacionalmente, o número de filhos que cada nó possui pode ter um grande impacto no desempenho (ver por exemplo: texto do link )
Aproveitar!
Paulo
fonte
Tecnicamente, a base não importa, mas geralmente você pode pensar nela como base-2.
fonte
Primeiro você deve entender o que significa para uma função f (n) ser O (g (n)).
A definição formal é: * Diz-se que uma função f (n) é O (g (n)) iff | f (n) | <= C * | g (n) | sempre que n> k, onde C e k são constantes. *
então seja f (n) = log base a de n, onde a> 1 e g (n) = log base b de n, onde b> 1
NOTA: Isso significa que os valores a e b podem ser qualquer valor maior que 1, por exemplo a = 100 e b = 3
Agora temos o seguinte: log base a de n é dito ser O (log base b de n) iff | log base a de n | <= C * | log de base b de n | sempre que n> k
Escolha k = 0 e C = log base a de b.
Agora nossa equação se parece com o seguinte: | log base a de n | <= log da base a de b * | log da base b de n | sempre que n> 0
Observe do lado direito, podemos manipular a equação: = log base a de b * | log base b de n | = | log de base b de n | * log base a de b = | log base a de b ^ (log base b de n) | = | log de base a de n |
Agora nossa equação se parece com o seguinte: | log base a de n | <= | log de base a de n | sempre que n> 0
A equação é sempre verdadeira, não importa quais são os valores n, b ou a, exceto suas restrições a, b> 1 e n> 0. Portanto, log base a de n é O (log base b de n) e como a, b não importa, podemos simplesmente omiti-los.
Você pode ver um vídeo do YouTube sobre ele aqui: https://www.youtube.com/watch?v=MY-VCrQCaVw
Você pode ler um artigo sobre ele aqui: https://medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca
fonte