Buscar

ANALISE DE ALGORITMO

Prévia do material em texto

Aula 1
Professor Ms Bruno Rocha
Recife, fevereiro 2019.1
(BV) ANÁLISE DE ALGORITMOS- CCO 4 NA
Apresentação
● Bruno do S. Rocha
● Mestre em engenharia de software (CESAR.EDU)
● Graduado em sistemas de informação (FIR)
● 15 anos de experiência em projetos de software
● Entusiasta da tecnologia da informação em saúde
Agenda
● Análise de algoritmos
● Conceitos
● Custo de um algoritmo
Análise de 
algoritmos
● Analisar o funcionamento de um algoritmo
● Calcular o custo de um algoritmo
● Escolher o algoritmo mais adequado para determinada classe de problemas
Objetivos macro
● Carga horária: 33h
● Prova
● Lista de exercícios
Aulas e avaliações
CORMEN, Thomas H., Algoritmos. Rio de Janeiro: Elsevier, 2012. 
 
TOSCANI, Laira Vieira., Complexidade de Algoritmos. Porto Alegre, 
Bookman, 2012. 3a ed. 
 
DOBRUSHKIN, Vladimir A., Métodos para Análise de Algoritmos. Rio de 
Janeiro: LTC, 2012. 
Bibliografia básica
DASGUPTA, Sanjoy, Algoritmos. Porto Alegre: AMGH, 2010. 
 
ASCENCIO, Ana F. Gomes, Estruturas de Dados: algoritmos, análise da 
complexidade e implementações em Java e C/C++. São Paulo: Pearson 
Prentice Hall, 2010. 
 
MENEZES, Paulo F. B., Linguagens Formais e Autômatos. Porto Alegre, 
Grupo A, 2011. 
 
TAMASSIA, Roberto; GOODRICH, Michael T., Estruturas de Dados e 
Algoritmos em Java. Porto Alegre: Grupo A, 2011. 
 
SZWARCFITER, Jayme Luiz, Estruturas de dados e seus algoritmos. Rio de 
Janeiro: LTC, 2015. 
Bibliografia complementar
Conceitos
➢ Conjunto das regras e procedimentos lógicos bem definidos que levam à 
solução de um problema em um número finito de etapas.
Algoritmo
Problema e instância
Um problema é definido por:
● Descrição dos parâmetros (entrada e saída)
● Descrição das propriedades que a resposta deve satisfazer
Uma instância de um problema é obtida quando fixamos valores para todos os parâmetros 
do problema.
Problema e instância
Problema: Ordenar uma sequência a1, a2, ..., an de maneira crescente
Entrada: a1, a2, …, an
Saída: a’1, a’2, …, a’n
Propriedades: a’1, a’2, …, a’n é uma permutação de a1, a2, …, an | a’1 <= a’2 <= … <= a’n
Instância: 10 20 5 40 4
 50 30 2 35 1
Corretude do algoritmo
O algoritmo é correto se, para toda instância de entrada, termina e produz uma saída que 
satisfaz às propriedades do problema.
➢ Para algoritmos iterativos, utiliza-se a técnica dos invariantes do laço
➢ Para algoritmos recursivos, a indução matemática no tamanho das instâncias
Corretude do algoritmo
Invariante de laço
O invariante de laço pode ser definido como uma relação entre as variáveis de um algoritmo (programa) 
que é verdadeira nas seguintes condições:
● antes do início do laço;
● durante a manutenção do laço;
● na saída do laço.
Um laço está correto se as seguintes 5 condições são satisfeitas:
● Início: O invariante é verdadeiro antes de entrar no laço.
● Invariância: O corpo do laço preserva o invariante.
● Progresso: O corpo do laço diminui a variante.
● Limitação: Quando a variante atinge certo valor, a guarda se torna falsa.
● Saída: A negação da guarda e o invariante descrevem o objetivo do laço.
Corretude do algoritmo
Indução matemática
A indução matemática é útil para provar asserções sobre a corretude e a eficiência de algoritmos, pois 
podemos inferir uma lei geral a partir de instâncias particulares.
Seja T um teorema que possua como parâmetro um número natural n. Para provarmos que T é verdadeiro 
para todos os possíveis valores de n, provamos que:
Base: T é válido para n = 1; 
Passo Indutivo: Para todo n > 1, se T é válido para n, então T é válido para n + 1.
Corretude do algoritmo
Indução matemática
 maxReg(A,n)
1. se n=1
2. então devolta A[1]
3. senão 
4. x = maxReg(A, n-1)
5. se x > A[n]
6. então devolva x
7. senão devolva A[n]
➢ Se n=1, o algoritmo devolve a resposta correta.
➢ Pode-se supor, por hipótese de indução, que para n >= 2 maxReg(A, n-1) produz o resultado 
esperado.
➢ Logo, no início da linha 5, x é o máximo dos elementos de A[1..n-1]. Considerando isso, as linhas 5 a 
7 calculam corretamente o máximo de A[1..n].
Custo de um 
algoritmo
Custo de um algoritmo
É fundamental que um programa produza a solução com dispêndio de tempo e de memória 
razoáveis. Daí se depreende a importância de projeto e análise de algoritmos.
A tabela abaixo mostra o desempenho desses dois algoritmos que calculam o determinante 
de uma matriz nxn, considerando tempos de operações de um computador real.
Como calcular o custo de um algoritmo?
➢ Análise empírica
➢ Análise teórica
Custo de um algoritmo
De maneira geral, deve-se contar:
➢ Quantidade de atribuições
➢ Quantidade de comparações
Custo de um algoritmo
Exemplo 1
int fatorial (int n){
int i, fat = 1;
for (i=1; i<=n; i++)
fat *= i;
return fat;
}
Custo de um algoritmo
Custo de um algoritmo
i = 1, 2, …, n+1
Resposta:
C(n)=1+2n+2+n+1 
C(n)=3n+4
Exemplo 1
int fatorial (int n){ //--> 0
int i, fat = 1; //--> 1
for (i=1; i<=n; i++) //--> 2(n+1)=2n+2
fat *= i; //--> n
return fat; //--> custo 1
}
Exemplo 2
int calculo(int [][] mat){
int i, j;
long temp = 0; 
for (i=0; i<mat.length; i++) 
for (i=0; i<mat.length; i++)
temp += mat[i][j];
return temp;
}
Custo de um algoritmo
Custo de um algoritmo
i = 0, 1, …, n 
j = 0, 1, …, n
Resposta:
C(n)=1+2n+2+2n²+2n+n²+1 
C(n)=3n²+4n+4
Exemplo 2
int calculo(int [][] mat){ //--> 0
int i, j;
long temp = 0; //--> 1
for (i=0; i<mat.length; i++) //--> 2(n+1)=2n+2
for (i=0; i<mat.length; i++) //--> n.2(n+1)=2n²+2n
temp += mat[i][j]; //--> n.n=n²
return temp; //--> 1
}
Exemplo 3
Custo de um algoritmo
void vetMaior(int[] vet, int [][] mat){
int i,j;
for (i=0; i<mat.length; i++){
vet[] = mat[i][0];
for (j=1; j<mat[i].length; j++){
if (mat[i][j] > vet[i]){
vet[i] = mat[i][j];
}
}
}
}
Exemplo 3
Custo de um algoritmo
i = 0, 1, …, n 
j = 1, 2, …, n
Melhor caso:
C(n)=2n+2+n+2n²+n²-n
C(n)=3n²+2n+2
void vetMaior(int[] vet, int [][] mat){
int i,j;
for (i=0; i<mat.length; i++){ //2n+2
vet[] = mat[i][0]; //n
for (j=1; j<mat[i].length; j++){ //2n²
if (mat[i][j] > vet[i]){ //n(n-1)
vet[i] = mat[i][j]; //n(n-1)
}
}
}
}
Pior caso:
C(n)=2n+2+n+2n²+n²-n+n²-n
C(n)=4n²+n+2
Contato
E-mail: brunodsr@hotmail.com
WhatsApp: (81) 9.8805-9960
mailto:brunodsr@hotmail.com

Continue navegando

Outros materiais