LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

24
LUCIANO D. ISAIAS 6766746 THAÍS F. VICENTIN 7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS

Transcript of LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

Page 1: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

L U C I A N O D . I S A I A S 6 7 6 6 7 4 6T H A Í S F. V I C E N T I N 7 5 4 7 4 2 0

PARADIGMAS DE PROJETOS DE ALGORITMOS

Page 2: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

O QUE É UM PARADIGMA?

• Um paradigma é um modelo que fornece e determina a visão que o programador possui sobre a estruturação e execução do programa.

Page 3: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

PROJETO DE ALGORITMO

O projeto de algoritmo requer abordagens adequadas:• A forma como um algoritmo aborda o problema

pode levar a um desempenho ineficiente.• Em certos casos, o algoritmo pode não conseguir

resolver o problema em tempo viável.

Não existe um paradigma que seja o melhor dentre todos.

Page 4: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

TIPOS DE PARADIGMAS

• Recursividade.• Tentativa e erro.• Divisão e conquista.• Programação dinâmica.• Algoritmos gulosos.• Algoritmos aproximados.

Page 5: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

RECURSIVIDADE

• Uma função é dita recursiva quando executa a si mesma, ou seja, dentro de um código, tem a capacidade de chamar um “subcódigo” para ser executado.

• A recursividade permite descrever algoritmos de formas que utilizem estruturas recursivas, mais claras e concisas, especialmente em problemas complexos.

Page 6: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

EXEMPLO: QUICKSORT

Page 7: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUICKSORT - PARTICIONAMENTO

Page 8: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUICKSORT – PIOR CASO

Page 9: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUICKSORT – MELHOR CASO

Page 10: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUICKSORT – VANTAGENS E DESVANTAGENS

Page 11: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUANDO NÃO USAR RECURSIVIDADE

• Algoritmos recursivos são apropriados quando o problema a ser resolvido ou os dados a serem tratados são definidos em termos recursivos. Entretanto, isso não garante que um algoritmo recursivo seja o melhor caminho para resolver o problema. • Vejamos dois exemplos ilustrativos de algoritmos

para calcular os números da sequência de Fibonacci:

Page 12: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

ALGORITMO 1: FUNÇÃO RECURSIVA

function FibRec (n: integer) : integer;begin

if n<2then FibRec := nelse FibRec := FibRec(n-1) + FibRec(n-2);

end;

Page 13: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

ALGORITMO 2 : FUNÇÃO ITERATIVA

function FibIter (n: integer): integer;var i, k, F: integer;begin

i :=1; F :=0;for k :=1 to n do

beginF := i+F;i := F-i;end;

FibIter :=F;end;

Page 14: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

COMPLEXIDADES DO ALGORITMO 1 E DO ALGORITMO 2

• O algoritmo 1 é O() = O(n), pois cada chamada recursiva é empilhada e esse número é O(n).• O algoritmo 2 tem complexidade de tempo O(n) e

complexidade de espaço O(1).

n 10 20 30 50 100

FibRec

8 ms 1 s 2 min 21 dias anos

FibIter

ms ms ½ ms ¾ ms 1,5 ms

Page 15: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

TENTATIVA E ERRO

• Um algoritmo tentativa e erro é aquele que testa exaustivamente todas as possíveis soluções de um problema, de modo a obter a solução desejada.

• A ideia é decompor o processo em um número finito de subtarefas parciais que devem ser exploradas.

• O processo geral pode ser visto como um processo de pesquisa ou tentativa que gradualmente constrói e percorre uma árvore de subtarefas.

Page 16: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

TABULEIRO DE XADREZ

Page 17: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

TENTA UM PRÓXIMO MOVIMENTO

procedure Tenta (i: integer; x,y: TipoIndice; var q: boolean);var u, v, k: integer; q1: boolean;begin

k := 0; {inicializa selecao de movimentos}repeat

k := k+1; q1 := false;u := x+a[k]; v := y+b[k];if (u in s) and (v in s)then if t[u,v] = 0

then begint[u,v] := i;if i<N*N {tabuleiro não esta cheio}then begin

Tenta (i+1, u, v, q1); {tenta novo movimento}if not q1then t [u,v] := 0 {não sucedido apaga reg. Anterior}end

else q1 := true;end;

until q1 or (k=8); {não há mais casas a visitar a partir de x,y}q := q1;

end;

Page 18: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

PASSEIO DE CAVALO NO TABULEIRO DE XADREZ

program PasseioCavalo;const N=8; {Tamanho do lado do tabuleiro}type TipoIndice = 1..N;var i, j: integer; t: array[TipoIndice, TipoIndice] of integer; q: boolean; s: set of TipoIndice; a, b: array[TipoIndice] of integer;{-- Entra aqui o procedimento Tenta do Programa anterior --}begin {programa principal}s := [1,2,3,4,5,6,7,8];a[1] := 2; a[2] :=1; a[3] :=-1; a[4] :=-2;b[1] := 1; b[2] :=2; b[3] := 2; b[4] :=1;a[5] :=-2; a[6] :=-1; a[7] :=1; a[8] :=2;b[5] :=-1; b[6] :=-2; b[7] :=-2; b[8] :=-1;for i:=1 to N do for j :=1 to N do t[i,j] := 0;t [i,i] :=1; {escolhemos uma casa do tabuleiro}Tenta (2,1,1,q);if qthen for i:=1 to N dobegin for j :=1 to N do write (t[i,j]:4); writeln; endelse writeln (‘Sem soluçao’);end.

Page 19: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

QUICKSORT - REORDENAÇÃO

Page 20: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

DIVISÃO E CONQUISTA

• Consiste em dividir o problema em partes menores, encontrar soluções para estas partes e combiná-las em uma solução global.

• Divide-se em 3 fases:1. Divisão (particionamento) do problema original em

sub-problemas similares ao original mas que são menores em tamanho.

2. Resolução de cada sub-problema sucessivamente e independentemente (em geral de forma recursiva).

3. Combinação das soluções individuais em uma solução global para todo o problema.

Page 21: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

O uso deste paradigma geralmente leva a soluções eficientes e elegantes, em especial quando é utilizado recursivamente.

Como exemplo, vamos considerar o problema de encontrar simultaneamente o maior elemento e o menor elemento de um vetor de inteiros.

Page 22: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

VERSÃO RECURSIVA PARA OBTER O MÁXIMO E O MÍNIMO

procedure MaxMin4 (Linf, Lsup: integer; var Max, Min: integer);var Max1, Max2, Min1, Min2, Meio: integer;begin

if Lsup – Linf <= 1then if A[Linf] < A[Lsup]

then begin Max := A[Lsup] ; Min := A[Linf] ; endelse begin Max := A[Linf] ; Min := A[Lsup]; end

else beginMeio := (Linf + Lsup) div 2;MaxMin4 (Linf, Meio, Max1, Min1);MaxMin4 (Meio+1, Lsup, Max2, Min2);if Max1 > Max2 then Max := Max1 else Max := Max2;if Min1 < Min2 then Min := Min1 else Min := Min2;end;

end;

Page 23: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

COMPLEXIDADE

• Seja T uma função de complexidade tal que T(n) é o número de comparações entre os elementos de A, se A tiver n elementos, T(n) = (3n/2) – 2 para o melhor caso, caso médio, e pior caso.

• Este algoritmo é ótimo.

Page 24: LUCIANO D. ISAIAS6766746 THAÍS F. VICENTIN7547420 PARADIGMAS DE PROJETOS DE ALGORITMOS.

FIM