Análise de Algoritmos
www.nakamura.eti.br/eduardo Análise de Algoritmos 2
www.nakamura.eti.br/eduardo Análise de Algoritmos 3
• Procedimento computacional bem definido
▫ Recebe algum valor, ou conjunto de valores, como entrada
▫ Produz algum valor, ou conjunto de valores, como saída
www.nakamura.eti.br/eduardo Análise de Algoritmos 4
Algoritmo
Entrada Saída
www.nakamura.eti.br/eduardo Análise de Algoritmos 5
• Procedimento computacional bem definido
▫ Recebe algum valor, ou conjunto de valores, como entrada
▫ Produz algum valor, ou conjunto de valores, como saída
• Ferramenta para resolver um problema computacional
▫ Enunciado especifica o relacionamento entre a entrada e a saída desejada
▫ Algoritmo é o procedimento para alcançar este relacionamento
www.nakamura.eti.br/eduardo Análise de Algoritmos 6
• Problema de ordenação
▫ Dada um conjunto de valores de entrada, ordená-los de forma crescente
▫ Usado freqüentemente na prática
▫ Um problema interessante para introduzir técnicas de projeto e de análise de algoritmos
• Especificação
▫ Entrada: uma seqüência de n números
▫ Saída: uma permutação da seqüência de entrada, tal que
www.nakamura.eti.br/eduardo Análise de Algoritmos 7
an
a
a1, 2,..., a n
a
a'1, '2 ,..., ' a n
a
a'1 '2 ..., '
• Uma instância
▫ Seqüência de entrada [1, 3, 2, 5, 6, 4]
▫ Seqüência de saída [1, 2, 3, 4, 5, 6]
• Instância de um problema
▫ Uma entrada que satisfaz as restrições para se calcular uma solução para o problema
www.nakamura.eti.br/eduardo Análise de Algoritmos 8
• Estruturas de dados
▫ Meio para armazenar e organizar dados com o objetivo de facilitar o acesso e as modificações
• Técnica
▫ Para muitos problemas você não terá algoritmos prontos
▫ O curso lhe ensinará algumas técnicas para que você desenvolva seus algoritmos
www.nakamura.eti.br/eduardo Análise de Algoritmos 9
• Os algoritmos estudados visam a eficiência
▫ Tempo de execução
▫ Espaço (memória) ocupado
▫ Classe de problemas P
• Nem todos os problemas possuem solução eficiente
▫ Classe de problemas NP-Completo
▫ Encontrados com grande freqüência na prática
▫ Exemplos
Caixeiro viajante
Binpacking
Steiner tree
www.nakamura.eti.br/eduardo Análise de Algoritmos 10
www.nakamura.eti.br/eduardo Análise de Algoritmos 11
• Se computadores fossem infinitamente rápidos, qual algoritmo você implementaria?
• Seria necessário estudar algoritmos?
www.nakamura.eti.br/eduardo Análise de Algoritmos 12
www.nakamura.eti.br/eduardo Análise de Algoritmos 13
• Especificação
▫ Entrada: uma seqüência de n números
▫ Saída: uma permutação da seqüência de entrada, tal que
▫ Os números a serem ordenados são chamados de chaves
• Isertion sort (inserção)
▫ Semelhante a ordenação de cartas em uma mão de jogo
www.nakamura.eti.br/eduardo Análise de Algoritmos 14
an
a
a1, 2,..., a n
a
a'1, '2,..., ' a n
a
a'1 '2 ..., '
an
a
a1, 2,...,
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 15
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 16
1 2 3 4 5 6
5 2 4 6 1 3
2
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 17
1 2 3 4 5 6
5 2 4 6 1 3
2
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 18
1 2 3 4 5 6
5 5 4 6 1 3
2
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 19
1 2 3 4 5 6
2 5 4 6 1 3
2
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 20
1 2 3 4 5 6
2 5 4 6 1 3
4
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 21
1 2 3 4 5 6
2 5 5 6 1 3
4
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 22
1 2 3 4 5 6
2 4 5 6 1 3
4
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 23
1 2 3 4 5 6
2 4 5 6 1 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 24
1 2 3 4 5 6
2 4 5 6 1 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 25
1 2 3 4 5 6
2 4 5 6 1 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 26
1 2 3 4 5 6
2 4 5 6 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 27
1 2 3 4 5 6
2 4 5 5 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 28
1 2 3 4 5 6
2 4 4 5 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 29
1 2 3 4 5 6
2 2 4 5 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 30
1 2 3 4 5 6
1 2 4 5 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 31
1 2 3 4 5 6
1 2 4 5 6 3
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 32
1 2 3 4 5 6
1 2 4 5 6 6
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 33
1 2 3 4 5 6
1 2 4 5 5 6
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 34
1 2 3 4 5 6
1 2 4 4 5 6
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 35
1 2 3 4 5 6
1 2 3 4 5 6
4 6 1 3
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 36
1 2 3 4 5 6
1 2 3 4 5 6
4 6 1 3
• Ao avaliar cada chave do vetor
▫ Quando o algoritmo trabalhou menos?
▫ Quando o algoritmo trabalhou mais?
• Baseado nisso
▫ Com qual entrada o algoritmo vai trabalhar menos?
▫ Com qual entrada o algoritmo vai trabalhar mais?
www.nakamura.eti.br/eduardo Análise de Algoritmos 37
INSERTION-SORT(A, n) 1: for j 2 to n do 2: chave A[j];
3: i j – 1;
4: while i > 0 and A[i] > chave do 5: A[i+1] A[i];
6: i i – 1;
7: end while
8: A[i+1] chave;
9: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 38
• Com qual entrada o algoritmo vai trabalhar menos?
• Com qual entrada o algoritmo vai trabalhar mais?
• Adapte o insertion-sort de maneira que o vetor de saída esteja na ordem decrescente
www.nakamura.eti.br/eduardo Análise de Algoritmos 39