A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 1 Engenharia de Computação. ECE05968 - Estruturas.

Apresentações semelhantes


Apresentação em tema: "Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 1 Engenharia de Computação. ECE05968 - Estruturas."— Transcrição da apresentação:

1 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 1 Engenharia de Computação. ECE Estruturas de Dados I - 3º período - 60 h - 3 créditos Ementa: Fundamentos de Análise de Algoritmos; Recursividade; Alocação dinâmica de memória; Conceito de Tipos Abstratos de Dados; Listas, Pilhas, Filas e Árvores como Tipos Abstratos de Dados; Implementação de Tipos Abstratos de Dados. Bibliografia Básica: Silva, Osmar Quirino. Estrutura de Dados e Algoritmos usando C: fundamentos e aplicações. Rio de Janeiro: Ciência Moderna, Tanenbaum, A.M. Estruturas de Dados em C. Makron Books. Schildt, H. C Completo e Total. ed. 3. Makron Books.

2 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 2 Start Programar é muito mais que escrever um programa. – Além de resolver o problema o programa deve ser: claro, eficiente e fácil de modificar. – Para isso, é necessario: disciplina e metodologia que imponham um estilo de desenvolvimento que garanta a qualidade do produto

3 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 3 Introdução a Análise de Algoritmos Estruturas de dados são formas sistemáticas de organizar e acessar dados. Algoritmo é um procedimento, passo a passo, para realizar alguma tarefa em um tempo finito. A análise de algoritmos permite avaliar a qualidade e eficiência de algoritmos: – Complexidade tempo – Complexidade espaço

4 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 4 Motivação Considere os programas P1 e P2 que resolvem o mesmo problema. Como decidir qual dos dois é o melhor? – Solução 1: implementar e testar Problemas: Diversidade de soluções Modificar dados de entrada para poder medir o desempenho medio pode ser inutil – Solução 2: Analisar para medir sua qualidade

5 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 5 Objetivos da análise Estabelecer uma medida da qualidade de um algoritmo sem a necessidade de implementa-lo. Estratégia: associar a cada algoritmo uma função matemática f(n) que meça sua eficiencia utilizando para isso unicamente as características estruturais do algoritmo. Aplicado também a avaliação de estruturas de dados.

6 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 6 Análise de Algoritmo A análise da eficiência de um algoritmo ou estrutura de dado pode basear-se em: – tempo de processamento em função dos dados de entrada; – espaço de memória total requerido para os dados; – comprimento total do código; – correcta obtenção do resultado pretendido; – robustez (como comporta-se com as entradas inválidas ou não previstas).

7 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 7 Tempo de Execução Depende de: – Velocidade do processador – Compilador – Estrutura do algoritmo Com exceção da última, os fatores mencionados não são inerentes à solução Portanto, para a análise considera-se apenas a estrutura do algoritmo, além do tamanho dos dados de entrada.

8 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 8 Exemplo de análise Considere o problema de inverter uma lista simplesmente encadeada:

9 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 9 Solução 1 (inverte direção dos ponteiros): p = cab; cab = NULL; while (p != NULL) { q = p->next; p->next = cab; cab = p; p = q; }

10 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 10 Solução 2 (inverte direção dos nós): p = cab; int temp; struct no *p,*q,*r; for(q = cab ; q->next != NULL ; q = q->next); for(p = cab ; p != q && p != q->next ; p = p->next) { temp = p->info; p->info = q->info; q->info = temp; for(r = p ; r->next != q ; r = r->next); q = r; }

11 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 11 Análise do tempo de execução:

12 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 12 Eficiência de um algoritmo // laco executado 1000 vezes repeticao1() { int i = 1; while(n <= 1000) n = n + 1; } // laco executado 500 vezes repeticao2() { int i = 1; while(n <= 1000) n = n + 2; } Nestes casos a eficiência é proporcional ao número de interações, ou seja, f(n) = n

13 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 13 Complexidade de um algoritmo Análise de Algoritmos é medição de complexidade de algoritmo Quantidade de "trabalho" necessária para a sua execução, expressa em função das operações fundamentais (ou primitivas), as quais variam de acordo com o algoritmo, e em função do volume de dados.

14 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 14 Operações primitivas (1) Atribuição de valores a variáveis Chamadas de métodos Operações aritméticas Comparações de dois números Acesso a um array Retorno de um método Uma operação primitiva corresponde a uma instrução de baixo nível com um tempo de execução constante, mas que depende do ambiente de hardware e software.

15 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 15 Operações primitivas (2) Ao invés de determinar o tempo de execução específico de cada operação primitiva, deve-se apenas contar quantas operações serão executadas. Assim será assumido que os tempos das diferentes operações primitivas são similares.

16 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 16 Exemplo de contagem do número de operações primitivas // a[] é um array com n>0 elementos inteiros // retorna o maior elemento do array void maximo(a,n) { int c; c = a[0]; for(i = 1; i < n; i++) { if(a[i] > c) c = a[i]; } return c; }

17 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 17 void maximo(a,n) { int c; c = a[0]; 2 opera ç ões for(i = 1; i < n; i++) { 4 opera ç ões if(a[i] > c) 2 opera ç ões c = a[i]; 2 opera ç ões } return c; 1 opera ç ão } O mínimo de operações é: 2+1+n+4(n-1)+1 T(n) = 5n O máximo de operações é: 2+1+n+6(n-1)+1 T(n) = 7n - 2

18 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 18 Notação Assintótica É mais importante concentrar na taxa de crescimento de tempo de execução como uma função do tamanho da entrada n, ao invés de concentrar nos detalhes (quantidade de operações primitivas) A ideia principal é: – encontrar f(n) fácil de calcular e conhecida que se comporte como T(n) – a qtde exata de operações primitivas. – T(n) cresce aproximadamente como f(n) – Em nenhum caso T(n) se comporta pior que f(n) ao se aumentar o tamanho do problema No exemplo anterior f(n) = n

19 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 19 Definicão : f(n) domina assintoticamente g(n) se existem duas constantes positivas c e n 0 tais que, para n n0, temos |g(n)| c |f(n)| Exemplo: Seja g(n) = n e f(n) = -n2 Temos que |n| |-n2| para todo n є N. Fazendo c = 1 e n 0 = 0 a expressão |f(n)| c |g(n)| é satisfeita. Logo, f(n) domina assintoticamente g(n). Dominação Assintótica

20 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 20 Notação O Notação O = big O = grande O = = ordem de magnitude = O Caracteriza o comportamento assintótico de uma função, estabelecendo um limite superior quanto à taxa de crescimento da função em relação ao crescimento de n.

21 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 21 Definição: Considere uma função f(n) não negativa para todos os inteiros n0. Dizemos que f(n) é O(g(n)) e escrevemos f(n) = O(g(n)), se existem um inteiro N e uma constante c>0, tais que para todo o inteiro n N, |f(n)| c |g(n)| O(f(n)) representa o conjunto de todas as funções que são assintoticamente dominadas por f(n).

22 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 22 Permite ignorar factores constantes e termos de menor ordem, centrando-se nos componentes que mais afectam o crescimento de uma função. A ordem de magnitude de f(n) = n + n 2 é n 2, ou seja, O(n 2 ) A ordem de uma função é igual a ordem do seu termo que cresce mais rapidamente f(n) = n + 2(n-1) + n k, logo O(f(n)) = O(n k ) f(n) = n + 2(n-1) + 3n + 10, logo O(f(n)) = O(n) f(n) = , logo O(f(n)) = O(1)

23 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 23 Outro exemplo de dominação assintótica:

24 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 24 Ordens mais comuns (1)

25 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 25 Ordens mais comuns (2) Terminologia de classes mais comuns de funções: – Constante – O(c) – Logarítmica - O(log n) – Linear - O(n) – Logarítmica linear - O(n log n) – Quadrática - O(n2) – Polinomial – O(n k ), com k 1 – Exponencial – O(a n ), com a > 1 – Fatorial – O(n!)

26 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 26 Avaliação de complexidade (1) Algoritmos de Complexidade Exponencial (ou Fatorial) só podem ser executados "em tempo útil" para instâncias de dimensões muito pequenas. Portanto, no sentido restrito de Solução de um Problema, o termo Algoritmo só deve ser aplicado quando a Complexidade é Polinomial (ou inferior). Métodos de Complexidade Exponencial correspondem a abordagens do tipo pesquisa exaustiva (ou força-bruta) quando não existe Algoritmo para a resolução de um problema.

27 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 27 Avaliação de complexidade (2) Os problemas de Pesquisa num Vetor são solucionado por Algoritmos de complexidade entre O(log 2 n) e O(n). O problema de Ordenção de um Vetor é solucionado por Algoritmos entre O(n log 2 n) e O(n 2 ). Os problemas relacionados com operações Matriciais exigem, em princípio, Algoritmos de complexidade O(n 3 ). Não existe ainda um valor mínimo teoricamente estabelecido.

28 Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 28 Teoremas da notação O Teorema 01: – Se T (n) é O (k f(n)) => T (n) também é O( f(n)) – O que importa não é o valor exato da função de complexidade e sim sua forma Teorema 02: – Se A1 e A2 são algoritmos tais que TA1(n) é O(f1(n)) e TA2 é O(f2(n)), o tempo empregado para executar A1 seguido de A2 é O (max(f1(n),f2(n))) Teorema 03: – O(f1(n)). O(f2(n) = O(f1(n). f2(n))


Carregar ppt "Eng. de Computação – Estruturas de Dados I – Fund. de Análise de Algoritmos prof. Henrique Monteiro Cristovão 1 Engenharia de Computação. ECE05968 - Estruturas."

Apresentações semelhantes


Anúncios Google