A notação Big Oh (O, Theta, Omega) é sobre taxas de crescimento de funções.
Quando você implementa um algoritmo, ele tem uma certa característica de como o tempo de execução muda quando você aumenta o conjunto de dados. Agora, você pode otimizar o algoritmo para que ele funcione mais rapidamente por um fator de 100. Claro, isso é ótimo, mas essencialmente ainda é o mesmo algoritmo. Da mesma forma, em alguns anos, os computadores podem ser duas vezes mais rápidos do que são hoje.
A notação Landau abstrai esses fatores constantes. Não se importa se um algoritmo f
é sempre duas vezes mais rápido que outro g
: talvez g
possa ser otimizado para executar 4 vezes mais rápido, ou você poderá comprar um hardware mais rápido. Se você olhar dessa perspectiva, pode dizer que eles são "iguais". (Isso não quer dizer que você pode (sempre) ignorar fatores constantes na prática.)
Oh grande especifica um limite superior, é semelhante à <=
relação.
Você concorda que isso 1 < 2
é verdade. Isso significa que 1
não pode ser menor que qualquer outro número? Certamente não. Há uma quantidade infinita de números maiores que 1
.
Com taxas de crescimento, é semelhante. O(n)
denota o conjunto de todas as funções que crescem linearmente (ou mais lentamente). O(n^2)
por outro lado, denota todas essas funções, que crescem com compelxidade quadrática (ou mais lenta). Estou certo de que você concorda que uma função linear cresce mais lentamente que uma função quadrática.
É por isso que uma função pode estar em mais de uma classe "Big-oh".
Aqui está uma comparação de diferentes funções com : (da matemática de Knuth's Concrete)
Da esquerda para a direita, as funções crescem mais rapidamente.
Além disso, o significado de n ^ 2 cresce mais rápido que n ^ 1 porque 2> 1.
Definições
"f cresce mais rápido ou igualmente rápido que g"
"f cresce mais devagar ou mais rápido que g"
A combinação dos dois acima. Diz que a função f
cresce "igualmente rápido" como g
. É uma relação de equivalência.
Interpretação
Digamos que você tenha dois algoritmos, f
e g
.
Ómega
Assumindo , significa que, independentemente do seu orçamento, não há uma quantidade constante de poder de computação que você pode adicionar ao seu sistema, de modo que f
sempre funcione tão rápido quanto g
.
Oh grande
Assumindo , significa que, se você tiver dados suficientes, f
sempre será executado com mais rapidez g
, independentemente da quantidade de poder de computação que você adicionar ao seu sistema.
Prova
Se você realmente está tentando provar isso, precisa mostrar, usando as definições da notação Landau, que sua função satisfaz as condições necessárias.
Então, você precisa encontrar valores para c
, d
, n_0
de tal forma que a condição se mantém.
Aqui está como você pode fazer isso no limite inferior com c
:
É importante perceber que me definir arbitrariamente c
como menor do que a-1
é perfeitamente adequado. A definição de Theta (g) diz que "existe um c
". Pode ser qualquer valor desde que seja maior que 0. (Se a
for um número real positivo, você precisará alterar a prova um pouco, pois a - 1
pode ser negativo)
(Suponho a
que seja positivo, caso contrário, a função sempre será negativa para grandes valores de n
, o que não faz sentido para uma função que denota o tempo de execução.)
Você pode tentar fazer isso no limite superior, é bem parecido. Se você não souber, posso fornecer uma prova para você.
Dica: comece com d > a + 1
Atenção
É importante que você não prove o contrário. Se você assume que (an + b) está em O (n) e segue a partir daí, você não provou o que queria. Você precisará verificar se todas as suas etapas seguem nos dois sentidos, ou seja, em vez de =>
você <=>
.