1 / 24

Paradigmas de Projetos de Algoritmos

Paradigmas de Projetos de Algoritmos. LUCIANO d. ISAIAS 6766746 Thaís f. Vicentin 7547420. 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.

cheng
Download Presentation

Paradigmas de Projetos de Algoritmos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Paradigmas de Projetos de Algoritmos LUCIANO d. ISAIAS 6766746 Thaís f. Vicentin 7547420

  2. 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.

  3. 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.

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

  5. 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.

  6. EXEMPLO: QUICKSORT

  7. Quicksort - particionamento

  8. Quicksort – Pior caso

  9. Quicksort – melhor caso

  10. Quicksort – vantagens e desvantagens

  11. 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:

  12. Algoritmo 1: função recursiva functionFibRec (n: integer) : integer; begin if n<2 thenFibRec := n elseFibRec := FibRec(n-1) + FibRec(n-2); end;

  13. Algoritmo 2 : função iterativa functionFibIter(n: integer): integer; var i, k, F: integer; begin i :=1; F :=0; for k :=1 to n do begin F := i+F; i := F-i; end; FibIter :=F; end;

  14. 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).

  15. 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.

  16. Tabuleiro de xadrez

  17. 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) thenift[u,v] = 0 thenbegin t[u,v] := i; if i<N*N {tabuleiro não esta cheio} thenbegin Tenta (i+1, u, v, q1); {tenta novo movimento} ifnotq1 then 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;

  18. Passeio de cavalo no tabuleiro de xadrez programPasseioCavalo; const N=8; {Tamanho do lado do tabuleiro} typeTipoIndice = 1..N; var i, j: integer; t: array[TipoIndice, TipoIndice] ofinteger; q: boolean; s: set ofTipoIndice; a, b: array[TipoIndice] ofinteger; {-- 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 toN 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 q then for i:=1 to N do begin for j :=1 to N do write(t[i,j]:4); writeln; end elsewriteln (‘Sem soluçao’); end.

  19. Quicksort - reordenação

  20. 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: • Divisão (particionamento) do problema original em sub-problemas similares ao original mas que são menores em tamanho. • Resolução de cada sub-problema sucessivamente e independentemente (em geral de forma recursiva). • Combinação das soluções individuais em uma solução global para todo o problema.

  21. 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.

  22. Versão recursiva para obter o máximo e o mínimo procedureMaxMin4 (Linf, Lsup: integer; var Max, Min: integer); var Max1, Max2, Min1, Min2, Meio: integer; begin ifLsup – Linf <= 1 then if A[Linf] < A[Lsup] then begin Max := A[Lsup] ; Min := A[Linf] ; end else begin Max := A[Linf] ; Min := A[Lsup]; end else begin Meio:= (Linf + Lsup) div 2; MaxMin4 (Linf, Meio, Max1, Min1); MaxMin4 (Meio+1, Lsup, Max2, Min2); ifMax1 > Max2 then Max := Max1 else Max := Max2; ifMin1 < Min2 then Min := Min1 else Min := Min2; end; end;

  23. 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.

  24. FIM

More Related