Conteúdo principal
Ciência da Computação
Curso: Ciência da Computação > Unidade 1
Lição 3: Notação assintóticaNotação Big-θ (Grande-Theta)
Vamos ver uma implementação simples da busca linear:
var doLinearSearch = function(array, targetValue) {
for (var guess = 0; guess < array.length; guess++) {
if (array[guess] === targetValue) {
return guess; // Encontrou!
}
}
return -1; // Não encontrou
};
Vamos indicar o tamanho do array (
array.length
) como n. O número máximo de vezes que um laço "for" pode ser executado é n, e esse pior caso ocorre quando o valor procurado não está presente no array. A cada iteração do laço, há diversas coisas a serem feitas:
- comparar a variável
guess
comarray.length
- comparar
array[guess]
comtargetValue
- possivelmente retornar o valor da variável
guess
- incrementar a variável
guess
.
Cada uma dessas pequenas computações são executadas em um tempo constante a cada iteração. Se o laço "for" se repete n vezes, então o tempo para todos as n iterações é c, start subscript, 1, end subscript, dot, n, em que c, start subscript, 1, end subscript é a soma de vezes para as computações em uma iteração. Agora, não podemos afirmar qual é o valor de c, start subscript, 1, end subscript, porque ele depende da velocidade do computador, da linguagem de programação usada, do compilador ou interpretador que traduz o código fonte em código executável e de outros fatores.
Esse código possui uma pequena sobrecarga extra, para configurar o laço "for" (o que inclui inicializar o valor de
guess
como 0) e possivelmente retornar -1
no final. Vamos chamar o tempo dessa sobrecarga de c, start subscript, 2, end subscript, que também é uma constante. Portanto, o tempo total para a busca linear no pior caso é c, start subscript, 1, end subscript, dot, n, plus, c, start subscript, 2, end subscript.Como dissemos, o fator constante c, start subscript, 1, end subscript e o termo de baixa ordem c, start subscript, 2, end subscript não nos dizem nada sobre a taxa de crescimento do tempo de execução. O importante é que o pior tempo de execução possível da busca linear aumenta de acordo com o tamanho do array n. A notação que usamos para esse tempo de execução é \Theta, left parenthesis, n, right parenthesis. Esta é a letra grega "theta" maiúscula e dizemos "Theta-grande de n" ou apenas "Theta de n."
Quando dizemos que um tempo de execução em particular é \Theta, left parenthesis, n, right parenthesis, estamos dizendo que, quando n fica grande o bastante, o tempo de execução é de pelo menos k, start subscript, 1, end subscript, dot, n e, no máximo, de k, start subscript, 2, end subscript, dot, n para quaisquer constantes k, start subscript, 1, end subscript e k, start subscript, 2, end subscript. É assim que devemos pensar no \Theta, left parenthesis, n, right parenthesis:
Para valores pequenos de n, não importa como o tempo de execução se compara com k, start subscript, 1, end subscript, dot, n ou k, start subscript, 2, end subscript, dot, n. Mas quando n fica grande o bastante — sobre ou à direita da linha pontilhada — o tempo de execução deve ficar entre k, start subscript, 1, end subscript, dot, n e k, start subscript, 2, end subscript, dot, n. Enquanto essas constantes k, start subscript, 1, end subscript e k, start subscript, 2, end subscript existirem, dizemos que o tempo de execução é \Theta, left parenthesis, n, right parenthesis.
Não estamos restritos a apenas n na notação Θ. Podemos usar qualquer função, como n, squared, n, log, start base, 2, end base, n, ou qualquer outra função de n. Aqui está um exemplo de como pensar em um tempo de execução que é \Theta, left parenthesis, f, left parenthesis, n, right parenthesis, right parenthesis para alguma função f, left parenthesis, n, right parenthesis:
Uma vez que o n fica grande o suficiente, o tempo de execução fica entre k, start subscript, 1, end subscript, dot, f, left parenthesis, n, right parenthesis e k, start subscript, 2, end subscript, dot, f, left parenthesis, n, right parenthesis.
Na prática, simplesmente descartamos fatores constantes e termos de ordem inferior. Outra vantagem de usar a notação Θ é que não temos que nos preocupar com quais unidades de tempo estamos usando. Por exemplo, suponha que você tenha calculado que um tempo de execução é de 6, n, squared, plus, 100, n, plus, 300 microssegundos. Ou talvez sejam milissegundos. Quando você usa a notação Θ, você não especifica isso. Você também descarta o fator 6 e os termos de ordem inferior 100, n, plus, 300, e você simplesmente diz que o tempo de execução é \Theta, left parenthesis, n, squared, right parenthesis.
Quando usamos a notação big-Θ estamos dizendo que temos um limite assintoticamente restrito no tempo de execução. "Assintoticamente" porque ele importa apenas para valores grandes de n. "Limite restrito" porque definimos o tempo de execução para um fator constante superior e inferior.
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?
- Como é definido o valor de k1 e k2?(7 votos)
- Há um pequeno trecho do texto que continua em inglês, tem alguma forma de corrigir? Grato(5 votos)
- Para fins de escrita,
O = Theta;
O tem valor numérico ou é só unidade mesmo?(3 votos)- Theta é o conjunto de todas as funções limitadas pelas duas constantes k1 e k2 (0 <= k1 <= k2) a partir de um certo n (veja a linha pontilhada no último gráfico). Assim, por exemplo, quando dizemos que o tempo de um algoritmo dado por uma função g(n) = n^2 + n é Theta(n^2), isto é, g(n) = Theta(n^2), no fundo estamos dizendo que a função g(n) = n^2 + n pertence ao conjunto das funções g(n) que estão no intervalo k1.n^2 <= g(n) <= k2.n^2, a partir de um certo valor constante de n (linha pontilhada).(15 votos)
- olha, talvez o problrma seja eu, mas o texto ficou bem cansativo, so depois de analisar o gráfico consegui entender.
se fosse depender do texto ia ser bem complicado.(2 votos) - como a função theta pode assumir o formato de função haverá lugares em que a diferença entre os limites será maior ou menor conforme o perfil da função. em termos práticos o que isso significa computacionalmente falando..?(1 voto)