Análise de Complexidade de Algoritmos

Documentos relacionados
5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Análise de Algoritmos

Estrututas de Dados e Algoritmos. Estrutura de Dados e Algoritmos

Análise da Complexidade de Algoritmos

ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS

Análise de complexidade

Aula 1. Teoria da Computação III

Complexidade de Algoritmos

ANÁLISE DE COMPLEXIDADE DE ALGORITMOS

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2008/2009

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Complexidade de algoritmos Notação Big-O

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2009/2010

ESTRUTURAS DE DADOS prof. Alexandre César Muniz de Oliveira

ALGORITMOS AVANÇADOS UNIDADE I Análise de Algoritmo - Notação O. Luiz Leão

Análise de Complexidade de Algoritmos. mario alexandre gazziro

ANÁLISE DE ALGORITMOS: PARTE 3

Melhores momentos AULA 1. Algoritmos p.38/86

Teoria da Computação Aula 9 Noções de Complexidade

Projeto e Análise de Algoritmos

Análise de Algoritmos

INF 1010 Estruturas de Dados Avançadas

Medida do Tempo de Execução de um Programa

Área que visa determinar a complexidade (custo) de um algoritmo, com isso é possível:

Análise de complexidade

Análise de Algoritmos Estrutura de Dados II

Análise e Projeto de Algoritmos

Análise de algoritmos

Análise de Algoritmos

Algoritmos 3/17/ Algoritmos como área de estudo e investigação

Algoritmos e Estruturas de Dados 2006/2007

Algoritmos Avançados Análise de Complexidade

Complexidade de Algoritmos

Algoritmos e Estruturas de Dados 2005/2006. Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema

Algoritmos e Estruturas de Dados 2005/2006

Técnicas de Programação III Análise de Algoritmos (Continuação)

Comparação com Divisão e Conquista

O termo Programação Dinâmica é um bocado infeliz.

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Complexidade de Algoritmos

Estruturas de Dados Algoritmos

01 Análise de Algoritmos (parte 2) SCC201/501 - Introdução à Ciência de Computação II

ALGORITMOS E ESTRUTURAS DE DADOS 2011/2012 ANÁLISE DE ALGORITMOS. Armanda Rodrigues 3 de Outubro 2011

Análise de Algoritmos

Complexidade de Algoritmos. Edson Prestes

Análise e Complexidade de Algoritmos

Módulo 7. Complexidade de Algoritmos. Algoritmos e Estruturas de Dados II C++ Rone Ilídio

Análise de Algoritmos

Quantidade de memória necessária

Algoritmos e Complexidade

Introdução à Análise de Algoritmos

Análise de algoritmos

Análise de algoritmos. Parte I

Comportamento Assintótico. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Análise e Projeto de Algoritmos

7. Introdução à Complexidade de Algoritmos

Teoria da Computação. Aula 3 Comportamento Assintótico 5COP096. Aula 3 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Complexidade de Algoritmos

Projeto e Análise de Algoritmos

7. Introdução à Complexidade de Algoritmos

Introdução à Ciência da Computação II

Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

INF 1010 Estruturas de Dados Avançadas

2. Complexidade de Algoritmos

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Capítulo. Análise de Algoritmos. 6.1 Complexidade de Algoritmos 6.1

Análise de algoritmos. Parte I

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

AULA 17. Melhores momentos. Segmento de soma máxima. Segmento de soma máxima. Conclusões. Algumas técnicas

Teoria dos Grafos Aula 7

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

QuickSort. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

BCC202 - Estrutura de Dados I

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

Análise e Projeto de Algoritmos

Análise de algoritmos Parte I

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Projeto e Análise de Algoritmos

Fernando Lobo. Algoritmos e Estrutura de Dados. Outra técnica de concepção de algoritmos, tal como Divisão e Conquista.

Teoria da Computação. Aula 4 Técnicas de Análise 5COP096. Aula 4 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Teoria da Computação Aula 8 Noções de Complexidade

Desafios de Programação

Capítulo 6 Análise de Algoritmos Capítulo 6

Introdução à Ciência da Computação II

Técnicas de Projeto de Algoritmos

ANÁLISE DE ALGORITMOS

Noções de complexidade de algoritmos

03 Análise de Algoritmos (parte 3) SCC201/501 - Introdução à Ciência de Computação II

1 a Lista de Exercícios

Complexidade de Algoritmos

Técnicas de projeto de algoritmos: Indução

Transcrição:

Análise de Complexidade de Algoritmos Algoritmos e Estruturas de Dados 2009/2010

Introdução Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema Análise de algoritmos: provar que um algoritmo está correcto determinar recursos exigidos por um algoritmo (tempo, espaço, etc.) comparar os recursos exigidos por diferentes algoritmos que resolvem o mesmo problema (um algoritmo mais eficiente exige menos recursos para resolver o mesmo problema) prever o crescimento dos recursos exigidos por um algoritmo à medida que o tamanho dos dados de entrada cresce AED - 2009/10 2

Complexidade espacial e temporal Complexidade espacial de um programa ou algoritmo: espaço de memória que necessita para executar até ao fim S(n) - espaço de memória exigido em função do tamanho (n) da entrada Complexidade temporal de um programa ou algoritmo: tempo que demora a executar (tempo de execução) T(n) - tempo de execução em função do tamanho (n) da entrada Complexidade versus Eficiência Por vezes estima-se a complexidade para o "melhor caso" (pouco útil), o "pior caso" (mais útil) e o "caso médio" (igualmente útil) AED - 2009/10 3

Crescimento de funções Na prática, é difícil (senão impossível) prever com rigor o tempo de execução de um algoritmo ou programa Obter o tempo a menos de: constantes multiplicativas (normalmente estas constantes são tempos de execução de operações atómicas) parcelas menos significativas para valores grandes de n Comparar crescimento Comparação de funções em pontos particulares: muito dependente dos coeficientes Comparação relevante: taxas de crescimento Avaliar taxa de crescimento em função com vários termos, crescimento é determinado pelo termo de crescimento mais rápido Coeficientes constantes influenciam o andamento inicial AED - 2009/10 4

Notação O( ) Definição: T(n) = O(f(n)) (ler: T(n) é de ordem f(n)) se e só se existem constantes positivas c e n 0 tal que T(n) cf(n) para todo o n>n 0 Exemplos: c k n k + c k-1 n k-1 + + c 0 = O(n k ) (c i - constantes) log 2 n = O(log n) (não se indica a base porque mudar de base é multiplicar por constante) 4 = O(1) (usa-se 1 para ordem constante) AED - 2009/10 5

Notação O( ) Notação para o crescimento relativo de funções T(n) = O( f(n) ) se existem constantes c e n' tais que T(n) c f(n) para n n' T(n) = Ω( f(n) ) se existem constantes c e n' tais que T(n) c f(n) para n n' T(n) = Θ( f(n) ) se e só se T(n) = O( f(n) ) e T(n) = Ω( f(n) ) T(n) = o( f(n) ) se T(n) = O( f(n) ) e T(n) Θ( f(n) ) AED - 2009/10 6

Ordens mais comuns f (exponencial) 2 n n 2 (quadrática) n log n n n (linear) log n (logarítmica) 1 (constante) Fonte: Sahni, "Data Structures, Algorithms and Applications in C++" AED - 2009/10 7

Termo Dominante Suponha que se usa N 3 para estimar N 3 +350N 2 + N Para N = 10000 Valor real = 1 003 500 010 000 Valor estimado = 1 000 000 000 000 Erro = 0.35% (não é significativo) Para valores elevados de N o termo dominante é indicativo do comportamento do algoritmo Para valores pequenos de N o termo dominante não é necessariamente indicativo do comportamento, mas geralmente, programas executam tão rapidamente que não importa AED - 2009/10 8

Estudo de um caso : subsequência máxima Problema: Dado um conjunto de valores (positivos e/ou negativos) A 1, A 2,, A n, determinar a subsequência de maior soma A subsequência de maior soma é zero se todos os valores são negativos Exemplos: -2, 11, -4, 13, -4,2 1, -3, 4, -2, -1, 6 AED - 2009/10 9

Subsequência máxima - cúbico template <class Comparable> Comparable maxsubsum1(const vector<comparable> &a) Comparable maxsum = 0; for (int i = 0 ; i < a.size() ; i++) for (int j = i; j < a.size(); j++) Comparable thissum = 0; for (int k = i; k <= j; k++) thissum += a[k]; if (thissum > maxsum) maxsum = thissum; return maxsum; AED - 2009/10 10

Subsequência máxima - cúbico Análise ciclo de N iterações no interior de um outro ciclo de N iterações no interior de um outro ciclo de N iterações O(N 3 ), algoritmo cúbico Valor estimado por excesso, pois alguns ciclos possuem menos de N iterações Como melhorar Remover um ciclo Ciclo mais interior não é necessário thissum para próximo j pode ser calculado facilmente a partir do antigo valor de thissum AED - 2009/10 11

Subsequência máxima - quadrático template <class Comparable> Comparable maxsubsum2(const vector<comparable> &a) Comparable maxsum = 0; for (int i = 0 ; i < a.size() ; i++) Comparable thissum = 0; for (int j = i; j < a.size(); j++) thissum += a[j]; if (thissum > maxsum) maxsum = thissum; return maxsum; AED - 2009/10 12

Subsequência máxima - quadrático Análise ciclo de N iterações no interior de um outro ciclo de N iterações O(N 2 ), algoritmo quadrático É possivel melhorar? Algoritmo linear é melhor : tempo de execução é proporcional a tamanho de entrada (difícil fazer melhor) Se A ij é uma subsequência com custo negativo, A iq com q>j não é a subsequência máxima AED - 2009/10 13

Subsequência máxima - linear template <class Comparable> Comparable maxsubsum3(const vector<comparable> &a) Comparable thissum = 0; Comparable maxsum = 0; for (int i = 0, j=0 ; j < a.size() ; j++) thissum += a[j]; if (thissum > maxsum) maxsum = thissum; else if (thissum < 0) i = j+1; thissum = 0; return maxsum; AED - 2009/10 14

Subsequência máxima - recursivo Método divisão e conquista Divide a sequência ao meio A subsequência máxima está: a) na primeira metade b) na segunda metade c) começa na 1ª metade, vai até ao último elemento da 1ª metade, continua no primeiro elemento da 2ª metade, e termina em um elemento da 2ª metade. Calcula as três hipóteses e determina o máximo a) e b) calculados recursivamente c) realizado em dois ciclos: percorrer a 1ª metade da direita para a esquerda, começando no último elemento percorrer a 2ª metade da esquerda par a direita, começando no primeiro elemento AED - 2009/10 15

Subsequência máxima - recursivo template <class Comparable> Comparable maxsubsum(const vector<comparable> &a, int left, int right) Comparable maxleftbordersum = 0, maxrightbordersum = 0 Comparable leftbordersum = 0, rightbordersum = 0; int center = (left + right ) / 2; if (left == right) return ( a[left] > 0? a[left] : 0 ) Comparable maxleftsum = maxsubsum (a, left, center); Comparable maxrightsum = maxsubsum (a, center + 1, right); AED - 2009/10 16

Subsequência máxima - recursivo for (int i = center ; i >= left ; i--) leftbordersum += a[i]; if (leftbordersum > maxleftbordersum) maxleftbordersum = leftbordersum; for (int j = center +1 ; j <= right ; j++) rightbordersum += a[j]; if (rightbordersum > maxrightbordersum) maxrightbordersum = rightbordersum; return max3( maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum); AED - 2009/10 17

Subsequência máxima - recursivo Análise Seja T(N) = tempo execução para problema tamanho N T(1) = 1 (recorda-se que constantes não interessam) T(N) = 2* T(N/2) + N duas chamadas recursivas, cada uma de tamanho N/2. O tempo de execução de cada chamada recursiva é T(N/2) tempo de execução de caso c) é N AED - 2009/10 18

Subsequência máxima - recursivo Análise T(N) = 2* T(N/2) +N T(1) = 1 T(N/2) = 2* T(N/4) + N/2 T(N/4) = 2* T(N/8) + N/4... T(N) = 2*2*T(N/4) + 2*N/2 + N T(N) = 2*2*2*T(N/8) + 2*2*N/4 +2*N/2 + N T(N) = 2 k * T(N/2 k ) + kn T(1) = 1 : N/2 k = 1 k = log 2 N T(N) = N*1 + N* log 2 N = O(N*logN) AED - 2009/10 19