Existem várias anotações , como ou e assim por diante. Fiquei me perguntando, se existem variações daquelas na realidade, como ou , ou se são matematicamente incorretas.
Ou seria correto dizer que é possível melhorar um para um O (3n ^ 2) ? Ainda não posso e não preciso descobrir tempos de execução e não preciso melhorar nada, mas preciso saber se é assim que você descreve suas funções na realidade.
Respostas:
Sim, ou são variações válidas.O(2n2) O(log(n2))
No entanto, você os verá raramente, se realmente os vir, principalmente nos resultados finais. A razão é que é . Da mesma forma, é . Isso pode ser surpreendente para iniciantes. No entanto, essas igualdades são mais ou menos a própria razão pela qual grandes anotações foram introduzidas, para ocultar um fator constante multiplicativo que geralmente é difícil de definir e relativamente insignificante.O(2n2) O ( n 2 ) O ( log ( n 2 ) ) O ( log n ) O O(n2) O(log(n2)) O(logn) O
Não é uma melhoria se a complexidade de tempo de um algoritmo for alterada de para ou de para , porque é enquanto é . Portanto, é incorreto dizer que a complexidade do tempo foi aprimorada de para . É correto dizer que a complexidade temporal de um algoritmo foi aprimorada de para , é claro.O(5n2) O(3n2) Ω(5n2) Ω(3n2) O(5n2) O(3n2) Ω(5n2) Ω(3n2) O(5n2) O(3n2) 5n2 3n2
Exercício 1. Mostre que .O(5n2)=O(3n2)=O(n2)
Exercício 2. Mostre que .O(logn)=O(log(n2))
Exercício 3. Mostre que .Ω(n2+n)=Ω(n2)
fonte
Você está sempre livre para não usar esta notação. Ou seja, você pode determinar uma funçãof(n) mais precisa possível e, em seguida, tentar melhorar isso. Por exemplo, você pode ter um algoritmo de classificação que faz comparações f(n) , para tentar criar outro algoritmo de classificação que faça apenas comparações g(n) . Obviamente, todos os tipos de funções f(n) existem (em teoria) e também podem surgir (na prática).
Em vez de tratar a notação Big Oh como mágica misteriosa, na qual é necessário consultar os assistentes para perguntar se você pode fazer alguma coisa, observe a definição . Respeite a definição e faça o que for necessário para realizar seu trabalho.
fonte
Embora a resposta aceita seja bastante boa, ela ainda não toca na verdadeira razão pela qualO(n)=O(2n) .
A notação Big-O descreve escalabilidade
Na sua essência, a Notação Big-O não é uma descrição de quanto tempo um algoritmo leva para ser executado. Nem é uma descrição de quantas etapas, linhas de código ou comparações um algoritmo faz. É mais útil quando usado para descrever como um algoritmo é escalonado com o número de entradas.
Faça uma pesquisa binária, por exemplo. Dada uma lista classificada, como você encontra um valor arbitrário dentro dela? Bem, você pode começar do meio. Como a lista é classificada, o valor do meio informará em qual metade da lista está o seu valor-alvo. Portanto, a lista que você precisa pesquisar agora está dividida ao meio. Isso pode ser aplicado recursivamente, passando para o meio da nova lista e assim sucessivamente até o tamanho da lista ser 1 e você encontrar seu valor (ou ele não existe na lista). Dobrar o tamanho da lista adiciona apenas uma etapa extra ao algoritmo, que é um relacionamento logarítmico. Portanto, esse algoritmo éO(logn) . O logaritmo é a base 2, mas isso não importa - o núcleo do relacionamento é que multiplicar a lista por um valor constante apenas adiciona um valor constante ao tempo.
Compare uma pesquisa padrão em uma lista não classificada - a única maneira de pesquisar um valor nesse caso é verificar cada uma delas. O pior cenário (que é o que o Big-O implica especificamente) é que seu valor está no final, o que significa que para uma lista de tamanhon , é necessário verificar n valores. Dobrar o tamanho da lista duplica o número de vezes que você deve verificar, que é um relacionamento linear. O(n) . Mas mesmo se você tivesse que executar duas operações em cada valor, algum processamento, por exemplo, o relacionamento linear ainda é válido. O(2n) simplesmente não é útil como descritor, pois descreveria exatamente a mesma escalabilidade que O(n) .
Compreendo que muitas dessas respostas estão basicamente dizendo para você chegar a essa conclusão lendo a definição de Big-O. Mas esse entendimento intuitivo levou um bom tempo para envolver minha cabeça e, por isso, eu a expus o mais claramente possível.
fonte
Você pode escreverO(f) para qualquer função f e faz todo o sentido. De acordo com a definição, g(n)=O(f(n)) se houver alguma constante c tal que g(n)≤cf(n) para todos grandes o suficiente n . Nada nessa definição diz quef deve ser algum tipo de função "agradável".
Mas, como outras respostas têm apontado,g(n)=O(f(n)) e g(n)=O(2f(n)) descrevem exatamente a mesma situação: se g(n)≤cf(n) para todos os suficientemente grandes n , então também temosg(n)≤c22f(n) , entãog(n)=O(2f(n)) , também (considerando a constantec/2 ).
Como uma questão secundária, não escreva "logn2 ", porque não está 100% claro do que isso significa. Você poderia dizer que obviamente significa log(n2) mas quase todo mundo escreveria isso como 2logn , o que coloca dúvidas na mente do leitor.
fonte
Observe a definição de O (f (n)) e veja que, por exemplo, O (2n ^ 2) e O (n ^ 2) são exatamente os mesmos. Alterar um algoritmo de operações de 5n ^ 2 para 3n ^ 2 é uma melhoria de 40%. Mudar de O (5n ^ 2) para O (3n ^ 2) não é realmente nenhuma alteração, eles são os mesmos.
Novamente, leia a definição de O (f (n)).
fonte
fonte