Вы находитесь на странице: 1из 32

Análise de Algoritmos

Aula 2

Comparação assintótica de funções


Gisele Alves Santana
Resumo da aula

Nesta aula, você vai:


§ Conhecer o que é a análise assinstótica;
§ Entender os principais tipos de
notações assintóticas;
§ Conhecer as notações:
• Big-O;
• Big-Theta;
• Big-Ômega.
Análise assintótica
Tempo de execução de um algoritmo.
Associado ao tempo que um computador leva para
executar as linhas de código desse algoritmo.
Depende da linguagem de programação que o
algoritmo foi escrito, do compilador utilizado, da
arquitetura e velocidade do computador, etc.
Considera o tamanho da entrada
§ Busca de um elemento em um
vetor: número de tentativas
aumenta de acordo com o
aumento do tamanho do vetor.
Análise assintótica

Tempo de execução de um algoritmo


Considera o crescimento de uma função conforme
o tamanho da entrada
§ Taxa de crescimento do tempo de execução.
Para facilitar essa análise, a função
deve ser simplificada até que represente
a parte mais importante.
Análise assintótica
Tempo de execução de um algoritmo
§ Exemplo:
• Algoritmo com uma entrada de tamanho n que
demore 6n2 + 100n + 300 instruções;
• Termo 6n2 torna-se maior que os demais termos,
pois tem um crescimento exponencial.
Análise assintótica
Exemplo:
§ O algoritmo cresce a uma taxa n2;
§ O coeficiente 6 e os termos 100n + 300 podem ser
ignorados (tempo de execução é an2 + bn + c);
§ Com o descarte de coeficiente constantes e
termos menos significativos:
• Enfoque se torna o
tempo de execução
(taxa de crescimento);
• Notação assintótica.
Continuando...
Comparação
assintótica de funções
Notação Big-O

Utilizada para delimitar o aumento do tempo


de execução, considerando os fatores
constantes inferiores e superiores.
Algumas vezes queremos saber apenas o
limite superior.
Notação Big-O

Em uma operação de busca, o tempo de


execução no pior caso é Θ(lg n)
§ Incorreto afirmar que a busca é
executada no tempo .
Notação Big-O
Θ(lg n) em todos os casos
§ Se o valor desejado é encontrado na 1ª tentativa,
então o algoritmo é executado em um tempo Θ(1);
§ Assim, o tempo de execução dessa busca nunca é
pior do que Θ(lg n). Porém, em algumas vezes, o
tempo de execução pode ser melhor.
Notação Big-O

É adequado ter uma forma de notação assintótica


que determine que o tempo de execução possa
crescer de diferentes maneiras, possuindo um
crescimento máximo, mas tendo crescimento mais
devagar em determinadas situações.
A notação “Big-O” ou "O-grande" é utilizada
para essas condições.
Notação Big-O

Utilizada para limites assintóticos superiores,


pois limita o crescimento do tempo de
execução superior para valores
suficientemente grandes de entrada.
Notação Big-O
Para entender melhor a notação...
§ Suponha que você tenha receba um salário de
R$ 2.000,00 e diga a um colega de trabalho que seu
salário não é maior que R$ 100.000,00;
§ Apesar de sua afirmação estar correta, ela não é
muito precisa, já que o último valor é muito
superior ao primeiro;
§ Da mesma maneira que O(n)
é um limite superior para
o tempo de execução da
busca binária.
Notação Big-O
Convenções
§ É prática comum escrever a expressão de O sem os
termos menos significantes
• Assim, em vez de O(n2 + nlog n + n),
escreve-se O(n2).
§ É comum desconsiderar os coeficientes constantes
• Em vez de O(3n2), escreve-se O(n2).
Notação Big-O
Exemplo
1 Linha ← 1
2 enquanto (linha ≤ tamanho_da_matriz ) faça
3 col ← 1
4 enquanto (col ≤ tamanho_da_matriz ) faça
5 m3 [ linha, col ] ← m1 [ linha, col ] + m2 [ linha, col ]
6 col ← col + 1
7 fim-enquanto
8 linha ← linha + 1
9 fim-enquanto
Notação Big-O
Analisando o exemplo
§ O “enquanto” externo (linha 2) é dependente
do tamanho da matriz;
§ Para cada execução da estrutura de repetição,
executa-se o “enquanto” mais interno (linha 4),
que também depende do tamanho da matriz;
Notação Big-O
Analisando o exemplo
§ Na linha 2, a estrutura de repetição percorre
a matriz de 1 até N;
§ A linha 4 percorre a matriz de 1 a N
• (N x N = N2).
§ Situação clássica da repetição quadrática
• Eficiência do algoritmo é O(n2).
Notação Big-O
Exemplo 2
1 coluna ← 1
2 enquanto (coluna ≤ tamanho_da_matriz ) faça
3 col ← 1
4 enquanto (col ≤ tamanho_da_matriz ) faça
5 m3 [ linha, col ] ← 0
6 k←1
7 enquanto (k ≤ tamanho_da_matriz ) faça
8 m3 [ linha, col ] ← m3 [ linha, col ] + m1 [ linha, k
] * m2 [ k, col ]
9 k←k+1
10 fim-enquanto
11 col ← col + 1
12 fim-enquanto
13 coluna ← coluna + 1
14 linha ← linha + 1
15 fim-enquanto
Notação Big-O

Analisando o exemplo 2
§ Três estruturas de repetição (linhas 2, 4 e 7);
§ Cada estrutura é iniciada e finalizada no
primeiro elemento;
§ Repetição cúbica;
§ Eficiência do algoritmo é O(n3).
Notação Big-O

Exemplo 3
§ Função: f(n) = 4n2 + 2n + 3
§ Primeiramente, assumir que os coeficientes
são iguais a 1, logo: f(n) = n2 + n +1
§ Em seguida, remover os fatores de menor
importância: f(n) = n2
§ Finalmente, a notação
será: O(f)n)) = O(n2)
Finalizando...
Comparação
assintótica de funções
Notação Big-!
Considere o código
int Busca(vet[]; int tam)
{
for (int i=0; i < tamanho; i++)
{
if(vetor[i] == valor_procurado)
{
return vetor[i]; //elemento encontrado
}
return -1;
}
}
Notação Big-!
Considerações sobre o código
§ A cada iteração, são executadas as instruções:
• O valor do índice i é comparado com o
tamanho do vetor;
• O valor armazenado na posição i é
comparado com o valor procurado;
• Se o valor comparado for igual
ao armazenado, é retornado
esse elemento;
• Senão, o valor do índice
é incrementado em
uma unidade.
Notação Big-!
Considerações sobre o código
§ Cada instrução consome um período de tempo
constante sempre que é executada;
§ Se o laço se repete n vezes, então o tempo
gasto por todas as n iterações é igual a: c1.n,
onde c1 corresponde à soma dos tempos das
computações de uma iteração;
Notação Big-!
Considerações sobre o código
§ Código possui uma variável para a criação do
laço (overhead) que é uma constante c2;
§ Assim, o tempo total para a busca de um
elemento nesse vetor no pior caso é:
c1.n+ c2
Notação Big-!

O fator constante c1 e o termo de baixa


ordem c2 não ajudam na identificação da taxa
de crescimento do tempo de execução.
Fator mais importante: o pior tempo possível da
busca aumenta conforme o tamanho do vetor.
Notação utilizada para esse tempo de
execução é Θ(n).
§ Se lê “Theta-grande de n”
ou apenas “Theta de n”.
Notação Big-!
Em um algoritmo que possui Pequenos valores de n:
tempo de execução Θ(n), • É comparado k1.n ou k2.n.
Grandes valores de n (do lado
quando n fica grande o direito da linha pontilhada):
bastante, o tempo de • Tempo de execução fica
execução é de pelo menos entre k1.n e k2.n.
Enquanto existirem as
k1.n e, no máximo, k2.n para constantes k1 e k2, diz-se que
quaisquer constantes k1 e k2. o tempo de execução é Θ(n).
Notação Big-!
Pequenos valores de n:
• É comparado k1.n ou k2.n.
Grandes valores de n (do lado
direito da linha pontilhada):
• Tempo de execução fica
entre k1.n e k2.n.
Enquanto existirem as
constantes k1 e k2, diz-se que
o tempo de execução é Θ(n).
Notação Big-!
Para facilitar, são descartados os fatores
constantes e termos de ordem baixa
§ Exemplo:
• Tempo de execução:
6n2 + 100n + 300 microssegundos;
• Na notação big-Θ, pode-se descartar o fator 6 e
os termos de baixa ordem 100n+300;
• Assim, o tempo de
execução para essa
função é somente Θ(n2).
Notação Big-Ω

Em algumas situações, é necessário determinar


que um algoritmo consome “ao menos” uma certa
quantidade de tempo para sua execução.
Nesses casos, é utilizada a notação Ω
(letra grega “omega”).
Em um tempo Ω(f(n)), para um n
suficientemente grande e para
uma constante k, o tempo de
execução será ao menos k⋅f(n)
Notação Big-Ω

Utilizada para denotar limites


assintóticos inferiores.
Delimita o aumento do tempo de
execução de maneira otimista para
entradas suficientemente extensas.

Вам также может понравиться