Upload
danganh
View
214
Download
0
Embed Size (px)
Citation preview
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
5COP096 Teoria da ComputaçãoTeoria da Computação
Aula 4
Prof. Dr. Sylvio Barbon Junior
1Sylvio Barbon Jr – [email protected]
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Sumário
1) Técnicas de Análise de Algoritmos
2) Paradigmas de Projeto de Algoritmos1) Indução
2) Recursão
3) Algoritmos Tentativa e erro
2Sylvio Barbon Jr – [email protected]
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Técnicas de Análise de Algoritmos
- A determinação do tempo de execução de um programa qualquer pode se tornar um problema matemático complexo quando se desejar encontrar o valor exato da função de complexidade.
- É mais fácil determinar que o número esperado de comparações é O(n) do que (n+1)/2, porém não tem a precisão adequada.
3Sylvio Barbon Jr – [email protected]
que (n+1)/2, porém não tem a precisão adequada.
- A análise de algoritmos utiliza técnicas de matemática discreta, não existe um conjunto de regras para analisar programas, mas algumas propriedades se destacam:
1) Instruções de atribuição, leitura ou escrita são O(1).
2) O tempo de execução de uma sequência de comandos será determinado pelo maior tempo de execução.
3) Comandos de decisão são O(1).
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Técnicas de Análise de Algoritmos
4) O tempo de execução de um anel (laço) é a soma do corpo mais o tempo para avaliação a condição para término, multiplicado pelo número de iterações do anel.
5) Procedimentos Recursivos estão associados a própria função de complexidade.
4Sylvio Barbon Jr – [email protected]
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Considerando os paradigmas para projeto de algoritmos, estudaremos:
- Indução;
- Recursividade;
- Tentativa e Erro;
- Divisão e Conquista;
5Sylvio Barbon Jr – [email protected]
- Balanceamento;
- Programação Dinâmica;
- Gulosos;
- Aproximados;
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Indução
“Raciocínio que parte de dados particulares e, por meio de uma sequência de operações cognitivas, chega a leis ou conceitos mais gerais, indo dos efeitos à causa, das consequências ao princípio, da experiência à teoria.”
6Sylvio Barbon Jr – [email protected]
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Indução
PASSO BASE HIPÓTESE DE INDUÇÃO
7Sylvio Barbon Jr – [email protected]
1. T é válido para n = 1.
2. Para todo n > 1, se T é válido para n-1, então T é válido para N.
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Indução
Exemplo 1. Comprovar que S(n) = 1 + 2 + 3 + ... + n é S(n) = n(n+1)/2
Prova por indução:
1) Passo Base: S(1) = 1 (1+1)/2 = 1
2) Hipótese de Indução:
8Sylvio Barbon Jr – [email protected]
S(n) é n(n+1)/2
S(n+1) = (n+1)(n+2)/2
S(n+1) = S(n) + (n+1)
S(n+1) = n(n+1)/2 + (n+1) = (n+1)(n+2)/2
Comprovado!
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Indução
Exemplo 2. Considere T(2n) ≤ 2T(n) + 2n -1, T(2) =1
Qual o f(n) para T(n) = O(f(n))?
Prova por indução:
Inequação, encontrar o limite
superior para O
Será que f(n) = n² ?
1) Passo Base: Será que f(n) = cn ?
1) Passo Base: Será que f(n) = n log n ?
9Sylvio Barbon Jr – [email protected]
1) Passo Base: T(2) = 1 ≤ f(2) = 4
2) Hipótese de Indução: T(2n) ≤ 2T(n) + 2n - 1
T(2n) ≤ 2n² + 2n – 1,
< (2n)² ,
< 4n²
Comprovado, mas 4n² apresenta 2n² de diferença, indicativo de
“folga” para T(n)
1) Passo Base: T(2n) ≤ c2n
2) Hipótese de Indução: T(2n) ≤ 2T(n) + 2n - 1
T(2n) ≤ 2cn + 2n – 1
> c2n
Diferença de 2n-1,indicativo de que T(n)
está entre cn e n².
Será que f(n) = n log n ?
1) Passo Base: T(2) < 2 log 2
2) Hipótese de Indução: T(2n) ≤ 2T(n) + 2n –1,
T(2n) ≤ 2n logn +2n – 1
< 2n log 2n
Diferença de apenas 1, indicativo de que T(n) está muito próximo da solução!
T(n) = n log n – n +1
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
- É um método que chama a si mesmo, direta ou indiretamente.
- Permite uma descrição mais clara e concisa de um algoritmo.
10Sylvio Barbon Jr – [email protected]
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
Exemplo 1: Árvore Binária de Pesquisa, onde todo no interno contémum registro com a seguinte propriedade, “Chaves menores na subárvoreesquerda e todos os registros com chaves maiores na subárvore direita”.
public class ArvoreBinaria {
11Sylvio Barbon Jr – [email protected]
public class ArvoreBinaria {private static class Noh{
Object reg;Noh esquerda;Noh direita;
}private Noh raiz;
}
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de AlgoritmosRecursão
Exemplo 1: Árvore Binária de Pesquisa.
Algoritmo mais popular para percorrer árvores é o “ordem decaminhamento central”.
private void central (Noh p){
12Sylvio Barbon Jr – [email protected]
O compilador utiliza uma estrutura de PILHA, onde são armazenados osdados para cada chamada de método que ainda não terminou de processar.
Cada variável fica armazenada sem acesso global, dentro da pilha derecursão.
private void central (Noh p){if (p!= null){
central(p.esquerda);System.out.println(p.reg.toString());central(p.dir);
}}
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
Todo comando repetitivo implicam a necessidade de considerar oproblema da terminação.
P ≡ if B then C[Si , P].
Sendo P um método recursivo, B a condição de terminação, C umacomposição dos comandos S e P.
13Sylvio Barbon Jr – [email protected]
composição dos comandos Si e P.
Exemplo: P ≡ if n > 0 then P[Si , P(n-1)].
Quando não usar Recursividade
Um algoritmo recursivo nem sempre é o melhor para resolver umproblema. O consumo de memória é maior do que outras soluções.
P ≡≡≡≡ if B then [S , P]. P ≡≡≡≡ (x=x0; while B do S)
Recursividade Não recursivo
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
Exemplo Fibonacci:
public class Fibonacci{
public static int fibRec(int n){
if(n<2) return n;
else return (fibRec (n-1) + fibRec(n-2));
f0 = 0f1= 1fn = fn-1 + fn-2
para n ≥ 2
{
14Sylvio Barbon Jr – [email protected]
else return (fibRec (n-1) + fibRec(n-2));
}
}
public class Fibonacci{
public static int fibRec(int n){
int i =1, f=0;
for(int k=1; k<=n; k++){
f = i+f;
i= f-i;
}
}
}
para n ≥ 20,1,1,2,3,5,8,13,21,34,55
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
Exemplo Fibonacci:
f0 = 0f1= 1fn = fn-1 + fn-2
para n ≥ 2
{n 10 20 30 50 100
Recursivo 8ms 1s 2min 21dias 109anos
15Sylvio Barbon Jr – [email protected]
para n ≥ 20,1,1,2,3,5,8,13,21,34,55
Recursivo 8ms 1s 2min 21dias 109anos
Iterativo 1/6ms 1/3ms 1/2ms 3/4ms 1,5ms
Brassard e Bradley (1996, p.73)
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão – Exemplo 1 – Torres de Hanoi
static void hanoi(int n, int O, int D, int T) {
if (n > 1) {
hanoi(n - 1, O, T, D);
}
mover(O, D);
if(n>1){
hanoi(n - 1, T, D, O);
}
}
T(1) = 1
T(n) = 2T(n-1) + 1
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão – Exemplo 2 – MergeSort
private static void sort( Comparable[] a, Comparable[] aux, int l, int r){
if ( r<=l+1) return;
int m = l + ( r – l ) / 2 ;
sort ( a, aux, l, m);
sort( a, aux, m, r);
merge( a , aux , l , m ,r);
}
T(1) = 0
T(n) = 2T(n/2) + n
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de AlgoritmosRecursão – Exemplo 3 – Busca em Árvore Bináriaindex binsearch(number n, index low, index high, const keytype S[], keytype x)
if low ≤ high thenmid = (low + high) / 2
if x = S[mid] thenreturn mid
elsif x < s[mid] thenelsif x < s[mid] thenreturn binsearch(n, low, mid-1, S, x)
elsereturn binsearch(n, mid+1, high, S, x)
elsereturn 0
end binsearch
T(1) = 1T(n) = T(n/2) + 1
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Recursão
Exercício 1:
Escreva um algoritmo recursivo para determinar o (um) maiorelemento de um vetor A[1..n] de inteiros;
Encontre a função de custo T(n) do algoritmo desenvolvido.Encontre a função de custo T(n) do algoritmo desenvolvido.
Qual a complexidade assintótica, O, do algoritmo desenvolvido?
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de AlgoritmosRecursão
Exercício 2:
Considere o algoritmo a seguir, supondo que a operação crucial é “inspecionarelemento”. O algoritmo inspeciona os n elementos de um conjunto e, de algumaforma, consegue descartar 2/5 dos elementos e fazer uma chamada recursiva sobreos 3n/5 elementos restantes. Escreva uma equação de recorrência que descrevaesse comportamento.esse comportamento.
void Pesquisa (int n)
{
if (n < 1)
‘inspecione elemento’;
termine;
else {
‘para cada um dos elementos, inspecione elemento’;
Pesquisa(3 * n / 5);
}
}
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de AlgoritmosRecursãoExercício 3:Considere a função abaixo:
int X(int a) { if (a<=0) then
return 0; return 0; else
return (a + X(a-1)); }
a) O que essa função faz? b) Calcule a sua ordem de complexidade. Mostre como você chegou a esse resultado. c) Escreva uma função não-recursiva que resolve o mesmo problema. Qual é a ordem de complexidade da sua função? Explique. d) Qual implementação é mais eficiente? Justifique.
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Paradigmas de Projeto de Algoritmos
Algoritmos Tentativa e Erro
- É a resolução de problemas tentando todas as alternativas possíveis;
- Recursividade pode ser usada para problemas de Tentativa e Erro;
- A ideia deste algoritmo é decompor o processo em um número finitode subtarefas parciais, exploradas exaustivamente;
- Seguem as seguintes regras:
1) Passos em direção à solução são “tentados” e registrados.
2) Caso um dos passos não leva à solução final, esse deve serretirado e apagado do registro;
5COP096 – Teoria da ComputaçãoAula 4 – Técnicas de Análise
Referências
Ziviani, Nivio. Projeto de algoritmos: com implementações em Java e C. Thomson Learning, 2007.
Leiserson, Charles E., Ronald L. Rivest, and Clifford Stein. Introduction to algorithms. Ed. Thomas H. Cormen. The MIT press, 2001.