If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Funções em notação assintótica

Quando usamos a notação assintótica para expressar a taxa de crescimento do tempo de execução de um algoritmo, em termos do tamanho de entrada n, é bom ter algumas coisas em mente.
Vamos começar com algo fácil. Suponha que um algoritmo demorou uma quantidade constante de tempo para ser executado, independentemente do tamanho da entrada. Por exemplo, se você recebeu um array que já estava em ordem crescente e você tinha que localizar o menor elemento, a execução levaria um tempo constante, já que o elemento mínimo deve estar no índice 0. Como gostamos de usar funções de n em notação assintótica, você poderia dizer que esse algoritmo é executado num tempo Θ(n0). Por quê? Porque n0=1, e o tempo de execução do algoritmo está contido em um fator constante de 1. Na prática, não escrevemos Θ(n0), em vez disso, escrevemos Θ(1).
Agora suponha que um algoritmo levou um tempo de Θ(log10n) para ser executado. Você também pode dizer que ele levou um tempo de Θ(log2n). Sempre que a base do logaritmo for constante, não importa em que base usamos a notação assintótica. Por que não? Porque existe uma fórmula matemática que diz:
logan=logbnlogba
para todos os números positivos a, b e n. Portanto, se a e b são constantes, então logan e logb n diferem apenas por um fator de logba, e isso é um fator constante que podemos ignorar em notação assintótica.
Portanto, podemos dizer que o pior cenário do tempo de execução de uma busca binária é Θ(logan) para qualquer constante positiva a. Por quê? O número de chutes é, no máximo, log2n+1, gerar e testar cada chute leva um tempo constante, e configurar e retornar o valor também leva um tempo constante. No entanto, por uma questão de prática, frequentemente escrevemos que a busca binária leva Θ(log2n) porque cientistas da computação gostam de pensar em potências de 2.
Há uma ordem para as funções que vemos frequentemente quando analisamos algoritmos usando notação assintótica. Se a e b são constantes e a<b, então o tempo de execução Θ(na) cresce mais lentamente do que um tempo de execução Θ(nb). Por exemplo, o tempo de execução Θ(n), que é Θ(n1), cresce mais lentamente do que um tempo de execução Θ(n2). Os expoentes também não têm de ser inteiros. Por exemplo, o tempo de execução de Θ(n2) cresce mais lentamente do que um tempo de execução Θ(n2n), que é Θ(n2,5).
O gráfico a seguir compara o crescimento de n, n2 e n2.5:
Logaritmos crescem mais lentamente do que os polinômios. Ou seja, Θ(log2n) cresce de forma mais lenta que Θ(na) para qualquer constante positiva a. Mas uma vez que o valor de log2n cresce quando n cresce, Θ(log2n) possui um crescimento mais rápido que Θ(1).
O gráfico a seguir compara o crescimento de 1, n e log2n:
Aqui está uma lista de funções em noção assintótica que encontramos muitas vezes quando analisamos algoritmos, listadas do crescimento mais lento para o crescimento mais rápido.
  1. Θ(1)
  2. Θ(log2n)
  3. Θ(n)
  4. Θ(nlog2n)
  5. Θ(n2)
  6. Θ(n2log2n)
  7. Θ(n3)
  8. Θ(2n)
  9. Θ(n!)
Observe que uma função exponencial an, em que a>1, cresce mais rápido do que qualquer função polinomial nb, em que b é qualquer constante.
A lista acima não é exaustiva, existem muitas funções com tempos de execução que não estão listadas aqui. Você vai encontrar com algumas delas em sua jornada na ciência da computação.
Este conteúdo é uma colaboração entre os professores de ciência da computação da Universidade de Dartmouth, Thomas Cormen e Devin Balkcom, juntamente com a equipe do currículo de computação da Khan Academy. O conteúdo é licenciado CC-BY-NC-SA.

Quer participar da conversa?

Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.