Paradigmas de Projetos de Algoritmos

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

description

Paradigmas de Projetos de Algoritmos. LUCIANO d. ISAIAS6766746 Thaís f. Vicentin7547420. 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. Projeto de algoritmo. - PowerPoint PPT Presentation

Transcript of Paradigmas de Projetos de Algoritmos

Page 1: 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: 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: 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: 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: 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: Paradigmas de Projetos de Algoritmos

EXEMPLO: QUICKSORT

Page 7: Paradigmas de Projetos de Algoritmos

QUICKSORT - PARTICIONAMENTO

Page 8: Paradigmas de Projetos de Algoritmos

QUICKSORT – PIOR CASO

Page 9: Paradigmas de Projetos de Algoritmos

QUICKSORT – MELHOR CASO

Page 10: Paradigmas de Projetos de Algoritmos

QUICKSORT – VANTAGENS E DESVANTAGENS

Page 11: 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: 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: 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: 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: 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: Paradigmas de Projetos de Algoritmos

TABULEIRO DE XADREZ

Page 17: 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: 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: Paradigmas de Projetos de Algoritmos

QUICKSORT - REORDENAÇÃO

Page 20: 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: 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: 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: 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: Paradigmas de Projetos de Algoritmos

FIM