Análise de Algoritmos

Documentos relacionados
BCC202 - Estrutura de Dados I

Medida do Tempo de Execução de um Programa

Análise de Algoritmos

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

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I

Aula 1. Teoria da Computação III

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

ANÁLISE DE ALGORITMOS: PARTE 3

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

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

Complexidade de algoritmos Notação Big-O

Quantidade de memória necessária

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

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

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

Análise de Algoritmos

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

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Complexidade de Algoritmos

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

INF 1010 Estruturas de Dados Avançadas

Análise de Algoritmos Estrutura de Dados II

Análise de Complexidade de Algoritmos. mario alexandre gazziro

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

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

Melhores momentos AULA 1. Algoritmos p.38/86

Algoritmos Avançados Análise de Complexidade

Projeto e Análise de Algoritmos

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

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

Teoria dos Grafos Aula 7

Análise de algoritmos. Parte I

Lista de Exercícios 6: Soluções Funções

2. Complexidade de Algoritmos

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

INF 1010 Estruturas de Dados Avançadas

Análise de complexidade

Complexidade assintótica de programas

Classes, Herança e Interfaces

Análise de Algoritmos

Lista de Exercícios 6 Funções

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

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

Teoria dos Grafos. Valeriano A. de Oliveira Socorro Rangel Departamento de Matemática Aplicada.

ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS

Noções de complexidade de algoritmos

Análise e Projeto de Algoritmos

Introdução. Última alteração: 10 de Outubro de Transparências elaboradas por Charles Ornelas, Leonardo Rocha, Leonardo Mata e Nivio Ziviani

Análise de Complexidade de Algoritmos

Universidade Federal de Mato Grosso do Sul Faculdade de Computação Disciplina de Verão: Algoritmos e Programação II

Projeto e Análise de Algoritmos

Análise de algoritmos Parte I

Complexidade de Algoritmos

Análise de Algoritmos Parte 4

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

1 a Lista de Exercícios

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

Projeto de Algoritmos Introdução

Aula 02 Notação Assintótica p. 4. Usodanotação O. Notação O. Notação O, Ω, ΘeExemplos. Intuitivamente... O(f(n)) funções que não crescem mais

Algoritmos e Estruturas de Dados I Aula 06 Custos de um algoritmo

Algoritmos e Estruturas de Dados I Prof. Tiago Eugenio de Melo

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

André Vignatti DINF- UFPR

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

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

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

ANÁLISE DE ALGORITMOS: PARTE 4

BCC202 - Estrutura de Dados I

Complexidade de Algoritmos

COMPLEXIDADE DE ALGORITMOS

7. Introdução à Complexidade de Algoritmos

MCTA028 Programação Estruturada Aula 20 Exercícios de custos de um algoritmo

BC1424 Algoritmos e Estruturas de Dados I Aula 05 Custos de um algoritmo e funções de complexidade

ESTRUTURA DE DADOS I AULA I

Análise de complexidade

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

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

Transcrição:

Análise de Algoritmos Parte 3 Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 Aula 06 Algoritmos e Estruturas de Dados I

Como escolher o algoritmo mais adequado para uma situação? (continuação)

Exercício da última aula teórica Obtenha a função de complexidade f(n) dos algoritmos abaixo. Considere apenas as operações envolvendo as variáveis x e y. Para cada algoritmo, responda: Qual o valor da variável x ao final da execução do algoritmo? O algoritmo é O(n 2 )? É Ω(n 3 )? O algoritmo é Ө(n 3 )? void exercicio1(int n) { int i, j, x, y; x = y = 0; for (i = 1; i <= n; i++) { for (j = i; j <= n; j++) x = x + 1; for (j = 1; j < i; j++) y = y + 1; } } void exercicio2(int n) { int i, j, k, x; x = 0; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 1; k <= j; k++) x = x + j + k; x = i; }

Perguntas?

Comportamento Assintótico de Funções Nas aulas passadas aprendemos: Como calcular a função de complexidade f(n). Ø Melhor caso x Caso médio x Pior caso Ø Qual a influência desta função em algoritmos aplicados sobre problemas de tamanho pequeno? Ø E sobre problemas grandes? Ø Estuda-se o comportamento assintótico das funções de custo. O que isto significa? 5

Qual a ordem de complexidade? void MaxMin1(int* A, int n, int* pmax, int* pmin) { int i; } *pmax = A[0]; *pmin = A[0]; for (i = 1; i < n; i++) { if (A[i] > *pmax) *pmax = A[i]; if (A[i] < *pmin) *pmin = A[i]; } 2*(n-1) 6

Qual a ordem de complexidade? void MaxMin2(int* A, int n, int* pmax, int* pmin) { int i; } *pmax = A[0]; *pmin = A[0]; for (i = 1; i < n; i++) { if (A[i] > *pmax) *pmax = A[i]; else if (A[i] < *pmin) *pmin = A[i]; } 2*(n-1) 7

Comportamento Assintótico de Funções Nas aulas passadas também aprendemos: Comportamento assintótico das função de complexidade f(n). Ø Dominação Assintótica Ø Notação O Ø Notação Ω e Notação Ө. 8

Operações com a Notação O 9

Dominação Assintótica f(n) domina assintoticamente g(n) se: Ø Existem duas constantes positivas c e m tais que, para n m, temos g(n) c f(n). 10

Notação O O valor da constante m mostrado é o menor valor possível, mas qualquer valor maior também é válido. Definição: uma função g(n) é O(f(n)) se existem duas constantes positivas c e m tais que g(n) c f(n), para todo n m. 11

Notação Ω Especifica um limite inferior para g(n). Definição: Uma função g(n) é Ω(f(n)) se: Ø Existem duas constantes positivas c e m tais que, para n m, temos g(n) c f(n). 12

Notação Ө Exemplo gráfico de dominação assintótica que ilustra a notação Ө. Especifica um limite assintótico firme para g(n). Ø Para ser Ө(f(n)), uma função deve ser ao mesmo tempo O(f(n)) e Ω(f(n)). 13

Notação Ө Ø Para mostrar que g(n) = 3n 3 + 2n 2 é Ω(n 3 ) basta fazer: c = 1, e então 3n 3 + 2n 2 n 3 para n 0. Ø Seja g(n) = n 2 para n par (n 0) g(n) = n para n ímpar (n 1). Neste caso g(n) poderá ser: Ω(n 2 ), se considerarmos apenas entradas pares Ω(n), se considerarmos apenas entradas ímpares Se considerarmos qualquer entrada possível, então g(n) é Ω(n) 14

Perguntas... n é O(n log n)? Esta afirmação é útil? n 3 é Ω(n)? Esta afirmação é útil? n é O(n)? n é Ω(n)? n é Ө(n)? n é Ө(n log n)? 15

Comparação de Programas Um programa com tempo de execução O(n) é melhor que outro com tempo O(n 2 ). Porém, as constantes de proporcionalidade podem alterar esta consideração. Exemplo: um programa leva 100n unidades de tempo para ser executado e outro leva 2n 2. Qual dos dois programas é melhor? Depende do tamanho do problema. Para n < 50, o programa com tempo 2n 2 é melhor do que o que possui tempo 100n. 16

Principais Classes de Problemas f(n) = O(1) Algoritmos de complexidade O(1) são ditos de complexidade constante. Uso do algoritmo independe de n. As instruções do algoritmo são executadas um número fixo de vezes. 17

Principais Classes de Problemas f(n) = O(log n) Um algoritmo de complexidade O(log n) é dito ter complexidade logarítmica. Típico em algoritmos que transformam um problema em outros menores. Pode-se considerar o tempo de execução como menor que uma constante grande. Quando n é mil, log 2 n 10, quando n é 1 milhão, log 2 n 20. Para dobrar log n temos que elever n ao quadrado. A base do logaritmo muda pouco estes valores: quando n é 1 milhão, o log 2 n é 20 e o log 10 n é 6. 18

Principais Classes de Problemas f(n) = O(n) Um algoritmo de complexidade O(n) é dito ter complexidade linear Em geral, um pequeno trabalho é realizado sobre cada elemento de entrada É a melhor situação possível para um algoritmo que tem de processar/produzir n elementos de entrada/saída. Cada vez que n dobra de tamanho, o tempo de execução dobra. 19

Principais Classes de Problemas f(n) = O(n log n) Típico em algoritmos que quebram um problema em outros menores, resolvem cada um deles independentemente e juntando as soluções depois. Quando n é 1 milhão, nlog 2 n é cerca de 20 milhões. Quando n é 2 milhões, nlog 2 n é cerca de 42 milhões, pouco mais do que o dobro. 20

Principais Classes de Problemas f(n) = O(n 2 ) Um algoritmo de complexidade O(n 2 ) é dito ter complexidade quadrática. Ocorrem quando os itens de dados são processados aos pares, muitas vezes em um anel dentro de outro. Quando n é mil, o número de operações é da ordem de 1 milhão. Sempre que n dobra, o tempo de execução é multiplicado por 4. Úteis para resolver problemas de tamanhos relativamente pequenos. 21

Principais Classes de Problemas f(n) = O(n 3 ) Um algoritmo de complexidade O(n 3 ) é dito ter complexidade cúbica. Úteis apenas para resolver pequenos problemas. Quando n é 100, o número de operações é da ordem de 1 milhão. Sempre que n dobra, o tempo de execução fica multiplicado por 8. 22

Principais Classes de Problemas f(n) = O(2 n ) Um algoritmo de complexidade O(2 n ) é dito ter complexidade exponencial. Geralmente não são úteis sob o ponto de vista prático. Ocorrem na solução de problemas quando se usa força bruta para resolvê-los. Quando n é 20, o tempo de execução é cerca de 1 milhão. Quando n dobra, o tempo fica elevado ao quadrado. 23

Principais Classes de Problemas f(n) = O(n!) Um algoritmo de complexidade O(n!) é dito ter complexidade exponencial, apesar de O(n!) ter comportamento muito pior do que O(2 n ). Geralmente ocorrem quando se usa força bruta para resolver o problema. n = 20 20! = 2.432.902.008.176.640.000, um número com 19 dígitos. n = 40 um número com 48 dígitos. 24

25

26

Algoritmo Polinomial Algoritmo exponencial no tempo de execução tem função de complexidade O(c n ); c > 1. Algoritmo polinomial no tempo de execução tem função de complexidade O(p(n)), onde p(n) é um polinômio. A distinção entre estes dois tipos de algoritmos torna-se significativa quando o tamanho do problema a ser resolvido cresce. Por isso, os algoritmos polinomiais são muito mais úteis na prática do que os exponenciais. 27

Quem vê, entende... Mas é quem faz que aprende! 28

Exercício 1 Indique se as afirmativas a seguir são verdadeiras ou falsas e justifique a sua resposta É melhor um algoritmo que requer 2 n passos do que um que requer 10n 10 passos. 2 n+1 = O(2 n ). f(n) = O(u(n)) e g(n) = O(v(n)) => f(n) + g(n) = O(u(n) + v(n)) f(n) = O(u(n)) e g(n) = O(v(n)) => f(n) - g(n) = O(u(n) - v(n)) 29

Exercício 2 // Considere A, B e C vetores globais void p1 (int n) { int i, j, k; for (i=0; i<n; i++) for (j=0; j<n; j++) { C[i][j]=0; for (k=n-1; k>=0; k--) C[i][j]=C[i][j]+A[i][k]*B[k][j]; } } Calcule a função de complexidade e a complexidade assintótica de p1 30

Exercício 3 void p2 (int n) { int i, j, x, y; void p3 (int n) { int i, j, x, y; } } x = y = 0; for (i=1; i<=n; i++) { for (j=i; j<=n; j++) x = x + 1; for (j=1; j<i; j++) y = y + 1; } } x = y = 0; for (i=1; i<=n; i++) { for (j=i; j<=n; j++) x = x + 1; Calcule a função de complexidade e a complexidade assintótica de p2 e p3. Qual é mais rápido? 31

Perguntas?