Análise de Algoritmos (Parte 3) - DECOM-UFOP

Propaganda
Aula T05 – BCC202
Análise de Algoritmos (Parte 3)
Túlio Toffolo
www.decom.ufop.br/toffolo
Como escolher o algoritmo mais
adequado para uma situação?
(Continuação)
Comportamento Assintótico de Funções
• Nas aulas passadas aprendemos:
• Como calcular a função de complexidade f(n).
 Melhor caso x Caso médio x Pior caso
 Qual a influência desta função em algoritmos
aplicados sobre problemas de tamanho pequeno?
 E sobre problemas grandes?
 Estuda-se o comportamento assintótico das funções
de custo. O que isto significa?
Qual a função de complexidade para MaxMin1?
void MaxMin1(int* A, int n, int* pMax, int* pMin)
{
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax) *pMax = A[i];
if (A[i] < *pMin) *pMin = A[i];
}
2*(n-1)
}
• Seja f(n) o número de comparações entre os elementos de A, se
A contiver n elementos.
• Logo f(n) = 2(n-1) para n > 0, para o melhor caso, pior caso e
caso médio.
Exemplo - Maior e Menor Elemento (2)
• MaxMin1 pode ser facilmente melhorado: a comparação
A[i] < *pMin só é necessária quando a comparação A[i] >
*pMax dá falso.
void MaxMin2(int* A, int n, int* pMax, int* pMin) {
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax) *pMax = A[i];
else if (A[i] < *pMin) *pMin = A[i];
}
}
Qual a função de complexidade para MaxMin2?
void MaxMin2(int* A, int n, int* pMax, int* pMin) {
int i;
Max = A[0];
Min = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax) *pMax = A[i];
else if (A[i] < *pMin) *pMin = A[i];
}
}
Melhor caso:
•
•
quando os elementos estão em ordem crescente;
•
•
quando o maior elemento é o primeiro no vetor;
f(n) = 2(n – 1)
•
•
No caso médio, A[i] é maior do que Max a metade das vezes.
f(n) = n – 1
Pior caso:
Caso médio:
f(n) = 3n/2 – 3/2
Comportamento Assintótico de Funções
• Nas aulas passadas também aprendemos:
• Comportamento assintótico das função de
complexidade f(n).
 Dominação Assintótica
 Notação O.
 Notação Ω e Notação Ө.
Dominação Assintótica
• f(n) domina assintoticamente g(n) se:
 Existem duas constantes positivas c e m tais que,
para n ≥ m, temos |g(n)| ≤ c|f(n)|.
Notação O
• O valor da constante m mostrado é o menor valor
possível, mas qualquer valor maior também é válido.
• Definição: uma função g(n) é O(f(n)) se existem duas
constantes positivas c e m tais que g(n) ≤ c f(n), para
todo n ≥ m.
Operações com a Notação O
Qual a complexidade da função MaxMin1?
void MaxMin1(int* A, int n, int* pMax, int* pMin)
{
int i;
*pMax = A[0];
*pMin = A[0];
for (i = 1; i < n; i++) {
if (A[i] > *pMax) *pMax = A[i];
if (A[i] < *pMin) *pMin = A[i];
}
O(n)
}
• Seja f(n) o número de comparações entre os elementos de A, se
A contiver n elementos.
• Logo f(n) = 2(n-1) para n > 0, para o melhor caso, pior caso e
caso médio.
Exercício da Última Semana...
void exercicio1 (int n)
{
int i, a;
a = 0; i = 0;
while (i < n) {
a += i;
i += 2;
}
}
void exercicio2 (int n)
{
int i, j, a;
a = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
a += i + j;
}
O(n2)
O(n)
n
2 
2
n 1
 i  0  1  2  ...  n  1 
i 0
(n  1)( n  1  1) n(n  1)

2
2
Notação Ω
• Especifica um limite inferior para g(n).
• Definição: Uma função g(n) é Ω(f(n)) se:
 Existem duas constantes positivas c e m tais que,
para n ≥ m, temos |g(n)| ≥ c|f(n)|.
Notação Ө
• Exemplo gráfico de dominação assintótica que ilustra a
notação Ө.
• Especifica um limite assintótico firme para g(n).
 Para ser Ө(f(n)), uma função deve ser ao mesmo tempo
O(f(n)) e Ω(f(n)).
Notação Ө
 Para mostrar que g(n) = 3n3 + 2n2 é Ω(n3) basta fazer:
c = 1, e então 3n3 + 2n2 ≥ n3 para n ≥ 0.
 Seja g(n) = n2 para n par (n ≥ 0)
g(n) = n para n ímpar (n ≥ 1).
Neste caso g(n) poderá ser:
Ω(n2), se considerarmos
apenas entradas pares
Ω(n), se considerarmos
apenas entradas
ímpares
Se considerarmos qualquer entrada possível, então g(n) é Ω(n)
Perguntas....
• n é O(n log n)? Esta afirmação é útil?
• n3 é Ω(n)? Esta afirmação é útil?
• n é O(n)?
• n é Ω(n)?
• n é Ө(n)?
• n é Ө(n log n)?
Data da Prova 1
• Quanto mais longe, mais matéria acumula =(
• Tipo Abstrato de Dados
• Análise de Algoritmos
•
•
•
•
Função de complexidade
Notações O, Ω e Ө
Classes de comportamento assintótico
Limites inferiores
• Alocação Dinâmica
• Recursividade
• Valor: 2,0 pontos
Data da Prova 1
• Site: www.decom.ufop.br/toffolo
• Listas de exercício estarão disponíveis ainda hoje no site
• Próximas aulas
•
•
•
•
•
Classes de comportamento assintótico
Limites inferiores
Alocação Dinâmica (reforço em TAD e ponteiros)
Recursividade
Aula de dúvidas para a prova
• Sugestão de data para a prova: até dia 21/Setembro
Horários de Monitoria
• Kayran (4h/semana)
• Terça-feira: 19h – 21h
• Quinta-feira: 19h – 21h
• Tiago (8h/semana)
•
•
•
•
Segunda-feira: 19h – 21h
Terça-feira: 19h – 21h
Quarta-feira: 19h – 21h
Quinta-feira: 19h – 21h
Aula(s) Extra(s)
• Presença não obrigatória
• Tema: Reforço sobre algoritmos e programação
• Interessados:
• Enviar e-mail para [email protected] com o assunto
[BCC202 – Aula Extra]
• Provavelmente próxima sexta-feira (manhã ou tarde).
• Data/horário a serem decididos por votação no site:
www.decom.ufop.br/toffolo
Quem vê, entende...
Mas é quem faz que aprende!
Exercício 1
• Obtenha a função de complexidade f(n) dos algoritmos abaixo. Na
função de custo, considere apenas as operações envolvendo as
variáveis x e y. Responder também, para cada algoritmo:
• Qual o valor da variável x ao final da execução do algoritmo?
• O algoritmo é O(n2)? É Ω(n3)?
• O algoritmo é Ө(n3)?
void ex1(int n) {
int i, j, x, y;
x = y = 0;
for (i = 1; i <= n; i++) {
for (j = i; j <= n; j++)
x = x + 1;
for (j = 1; j < i; j++)
y = y + 1;
}
}
void ex2(int n) {
int i, j, k, x;
x = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
for (k = 1; k <= j; k++)
x = x + j + k;
x = i;
}
Exercício 2
•
Indique se as afirmativas a seguir são verdadeiras ou
falsas e justifique a sua resposta
•
É melhor um algoritmo que requer 2n passos do que um que
requer 10n10 passos.
•
2n+1 = O(2n).
•
f(n) = O(u(n)) e g(n) = O(v(n))
=> f(n) + g(n) = O(u(n) + v(n))
•
f(n) = O(u(n)) e g(n) = O(v(n))
=> f(n) - g(n) = O(u(n) - v(n))
Download