Análise de Algoritmos

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

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

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

Aula 02: Custos de um algoritmo e funções de complexidade

Complexidade de algoritmos Notação Big-O

BCC202 - Estrutura de Dados I

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

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

MCTA028 Programação Estruturada Aula 19 Custos de um algoritmo e funções de complexidade

Análise de Algoritmos

Aula 01 Introdução Custo de um algoritmo, Funções de complexidad e Recursão

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

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

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

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Análise de complexidade

Teoria da computabilidade Indecidíveis Decidíveis

ESTRUTURAS DE DADOS E ALGORITMOS APRESENTAÇÃO DO CURSO E INTRODUÇÃO

Aula 03 Custos de um algoritmo e funções de complexidade

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

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

BCC202 - Estrutura de Dados I

Análise de Complexidade de Algoritmos. mario alexandre gazziro

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

BCC202 - Estrutura de Dados I

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

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Projeto e Análise de Algoritmos

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Análise de Algoritmos Estrutura de Dados II

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

Complexidade de Algoritmos

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

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

Quantidade de memória necessária

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

1 a Lista de Exercícios

4. Algoritmos de Busca em Vetores

Análise de Algoritmos Parte 4

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Pesquisa Linear. Adriano J. Holanda 15/3/2016

Aula 07: Algoritmos de busca e Listas encadeadas

ANÁLISE DE ALGORITMOS: PARTE 1. Prof. André Backes. Como resolver um problema no computador? Precisamos descrevê-lo de uma forma clara e precisa

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

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

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

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

Carlos Eduardo Batista. Centro de Informática - UFPB

Classes, Herança e Interfaces

Pesquisa Sequencial e Binária

BCC202 - Estrutura de Dados I

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS

1. Se v é um vetor, qual a diferença conceitual entre as expressões v[70] e v+70? [2 ponto]

Técnicas de análise de algoritmos

3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)

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

UNIVERSIDADE DA BEIRA INTERIOR

Ordenação em Tempo Linear

Programação: Vetores

Programação de Computadores II. Cap. 17 Busca

Aula 18 Algoritmos básicos de busca e classificação

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

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

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

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

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

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

Árvores Binárias de Busca

Projeto e Análise de Algoritmos

Projeto e Análise de Algoritmos

Transcrição:

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

Qual a diferença entre um algoritmo e um programa?

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

Análise de Algoritmos Analisar um algoritmo consiste em verificar o que? Tempo de Execução Espaço/memória ocupada Esta análise é necessária para escolher o algoritmo mais adequado para resolver um dado problema. É especialmente importante em áreas como pesquisa operacional, otimização, teoria dos grafos, estatística, probabilidades, entre outras. 4

Cálculo do Custo Cálculo do Custo pela Execução do Algoritmo Tal medidas é bastante inadequada e o resultado não pode ser generalizado; Os resultados são dependentes do compilador, que pode favorecer algumas construções em detrimento de outras; Os resultados dependem do hardware; Quando grandes quantidades de memória são utilizadas, as medidas de tempo podem depender deste aspecto. 5

Cálculo do Custo Cálculo do Custo pela Execução do Algoritmo Apesar disso, há argumentos a favor de se obterem medidas reais de tempo. Ex.: quando há vários algoritmos distintos para resolver um mesmo tipo de problema, todos com um custo de execução dentro de uma mesma ordem de grandeza. 6

Análise de Algoritmos Possibilidade de analisar: Um algoritmo particular. Uma classe de algoritmos. 7

Análise de Algoritmos Análise de um algoritmo particular. Qual é o custo de usar um dado algoritmo para resolver um problema específico? Características que devem ser investigadas: Análise do número de vezes que cada parte do algoritmo deve ser executada (tempo) Estudo da quantidade de memória necessária (espaço). 8

Análise de Algoritmos Análise de uma classe de algoritmos. Qual é o algoritmo de menor custo possível para resolver um problema particular? Toda uma família de algoritmos é investigada. Procura-se identificar um que seja o melhor possível. Coloca-se limites para a complexidade computacional dos algoritmos pertencentes à classe. 9

Custo de um Algoritmo O menor custo possível para resolver problemas de uma classe nos dá a dificuldade inerente para resolver o problema. Quando o custo de um algoritmo é igual ao menor custo possível, o algoritmo é ótimo para a medida de custo considerada. Podem existir vários algoritmos ótimos para resolver o mesmo problema. Se a mesma medida de custo é aplicada a diferentes algoritmos, então é possível compará-los e escolher o mais adequado. 10

Custo de um Algoritmo Utilizaremos um modelo matemático baseado em um computador idealizado. Deve ser especificado o conjunto de operações e seus custos de execuções. É mais usual ignorar o custo de algumas operações e considerar apenas outras mais significativas. Ex.: algoritmos de ordenação. Consideramos o número de comparações entre os elementos do conjunto a ser ordenado e ignoramos as demais operações. 11

Função de complexidade Para medir o custo de execução de um algoritmo vamos definir uma função de complexidade ou função de custo f. Função de complexidade de tempo: f(n) mede o tempo necessário para executar um algoritmo em um problema de tamanho n. Função de complexidade de espaço: s(n) mede a memória necessária para executar um algoritmo em um problema de tamanho n. 12

Função de complexidade Utilizaremos f para denotar uma função de complexidade de tempo daqui para a frente. A complexidade de tempo na realidade não representa tempo diretamente Representa o número de vezes que determinadas operações relevantes são executadas. 13

Exemplo: maior elemento Considere o algoritmo para encontrar o maior elemento de um vetor de inteiros A[n]; n 1. int Max(int* A, int n) { int i, Temp; Temp = A[0]; for (i = 1; i < n; i++) if (Temp < A[i]) Temp = A[i]; return Temp; Seja f uma função de complexidade tal que f(n) é o número de comparações envolvendo os elementos de A, se A contiver n elementos. Qual a função f(n)? 14

Exemplo: maior elemento Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n 1, faz pelo menos n -1 comparações. Prova: Cada um dos n - 1 elementos tem de ser investigado por meio de comparações, que é menor do que algum outro elemento. Logo, n-1 comparações são necessárias. O teorema acima nos diz que, se o número de comparações for utilizado como medida de custo, então a função Max do programa anterior é ótima. 15

Tamanho da entrada de dados A medida do custo de execução de um algoritmo depende principalmente do tamanho da entrada dos dados. É comum considerar o tempo de execução de um programa como uma função do tamanho da entrada. Para alguns algoritmos, o custo de execução é uma função da entrada particular dos dados, não apenas do tamanho da entrada. 16

Tamanho da entrada de dados No caso da função Max do programa do exemplo, o custo é uniforme sobre todos os problemas de tamanho n. Já para um algoritmo de ordenação isso não ocorre: se os dados de entrada já estiverem quase ordenados, então pode ser que o algoritmo trabalhe menos. 17

Melhor caso, pior caso e caso médio Melhor caso: menor tempo de execução sobre todas as entradas de tamanho n. Pior caso: maior tempo de execução sobre todas as entradas de tamanho n. Caso médio (ou caso esperado): média dos tempos de execução de todas as entradas de tamanho n. Melhor caso <= Caso médio <= Pior caso 18

Análise do melhor caso, pior caso e caso médio Na análise do caso médio esperado, supõe-se uma distribuição de probabilidades sobre o conjunto de entradas de tamanho n e o custo médio é obtido com base nessa distribuição. A análise do caso médio é geralmente muito mais difícil de se obter do que as análises do melhor e do pior caso. É comum supor uma distribuição de probabilidades em que todas as entradas possíveis são igualmente prováveis. Na prática isso nem sempre é verdade. 19

Exemplo: registros de um arquivo Considere o problema de acessar os registros de um arquivo. Cada registro contém uma chave única que é utilizada para recuperar registros do arquivo. O problema: dada uma chave qualquer, localize o registro que contenha esta chave. O algoritmo de pesquisa mais simples é o que faz a pesquisa sequencial. 20

Exemplo: registros de um arquivo Seja f uma função de complexidade f(n) Seja f(n) o número de registros consultados no arquivo (número de vezes que a chave de consulta é comparada com a chave de cada registro). Melhor caso: O registro procurado é o primeiro consultado!!! f(n) = 1 21

Exemplo: registros de um arquivo Pior caso: registro procurado é o último consultado ou não está presente no arquivo; f(n) = n Caso médio: O caso médio nem sempre é tão simples de calcular; Como faremos neste problema??? 22

Exemplo: registros de um arquivo No estudo do caso médio, vamos considerar que toda pesquisa recupera um registro. Se p i for a probabilidade de que o i-ésimo registro seja procurado, e considerando que para recuperar o i-ésimo registro são necessárias i comparações, então: f(n) = 1 x p 1 + 2 x p 2 + 3 x p 3 +... + n x p n 23

Exemplo: registros de um arquivo Para calcular f(n) basta conhecer a distribuição de probabilidades p i. Se cada registro tiver a mesma probabilidade de ser acessado que todos os outros, então p i = 1/n, 1 i n 24

Exemplo: registros de um arquivo Para calcular f(n) basta conhecer a distribuição de probabilidades p i. p i = 1/n, 1 i n A análise do caso esperado revela que uma pesquisa com sucesso examina aproximadamente metade dos registros. 25

Exemplo: registros de um arquivo Melhor caso: O registro procurado é o primeiro consultado!!! f(n) = 1 Pior caso: registro procurado é o último consultado ou não está presente no arquivo; f(n) = n Caso médio: f(n) = (n+1)/2 26

Exemplo: maior e menor elemento (1) Considere o problema de encontrar o maior e o menor elemento de um vetor de inteiros A[n]; n 1. Um algoritmo simples pode ser derivado do algoritmo apresentado no programa para achar o maior elemento. 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]; 27

Qual a função 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) 28

Qual a função de complexidade? Seja f(n) o número de comparações entre os elementos de A, se A contiver n elementos. Logo f(n) = 2(n-1) para n > 0, para o melhor caso, pior caso e caso médio. 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]; 29

Exemplo: maior e menor elemento (2) MaxMin1 pode ser facilmente melhorado: a comparação A[i] < *pmin só é necessária quando a comparação A[i] > *pmax dá falso. 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]; 30

Qual a função de complexidade? Melhor caso: quando os elementos estão em ordem crescente; f(n) = n 1 Pior caso: quando o maior elemento é o primeiro no vetor; f(n) = 2(n 1) Caso médio: No caso médio, A[i] é maior do que Max a metade das vezes. f(n) = 3n/2 3/2 31

Exemplo: maior e menor elemento (3) Considerando o número de comparações realizadas, existe a possibilidade de obter um algoritmo mais eficiente: 1. Compare os elementos de A aos pares, separando-os em dois subconjuntos (maiores em um e menores em outro), a um custo de n/2 comparações. 2. O máximo é obtido do subconjunto que contém os maiores elementos, a um custo de n/2-1 comparações 3. O mínimo é obtido do subconjunto que contém os menores elementos, a um custo de n/2-1 comparações 32

Exemplo: maior e menor elemento (3) Os elementos de A são comparados dois a dois. Os elementos maiores são comparados com *pmax e os elementos menores são comparados com *pmin. Quando n é ímpar, o elemento que está na posição A[n-1] é duplicado na posição A[n] para evitar um tratamento de exceção. Para esta implementação: no pior caso, melhor caso e caso médio 33

Exemplo: maior e menor elemento (3) void MaxMin3(int* A, int n, int* pmax, int* pmin) { int i, FimDoAnel; if ((n % 2) > 0) { A[n] = A[n-1]; FimDoAnel = n; else { FimDoAnel = n-1; if (A[0] > A[1]) { *pmax = A[0]; *pmin = A[1]; else { *pmax = A[1]; *pmin = A[0]; for (i=2; i<fimdoanel; i+=2) { if (A[i] > A[i+1]) { if (A[i] > *pmax) *pmax = A[i]; if (A[i+1] < *pmin) *pmin = A[i+1]; else { if (A[i] < *pmin) *pmin = A[i]; if (A[i+1] > *pmax) *pmax = A[i+1]; Comparação 1 Comparação 2 Comparação 3 Comparação 4 Comparação 3 Comparação 4 34

Qual a função de complexidade? Quantas comparações são feitas em MaxMin3? 1ª. comparação feita 1 vez 2ª. comparação feita n/2-1 vezes 3ª. e 4ª. comparações feitas n/2 1 vezes f(n) = 1 + n/2 1 + 2 * (n/2 1) f(n) = (3n 6)/2 + 1 f(n) = 3n/2 3 + 1 = 3n/2-2 35

Comparação entre os algoritmos MaxMin A tabela apresenta uma comparação entre os algoritmos dos programas MaxMin1, MaxMin2 e MaxMin3, considerando o número de comparações como medida de complexidade. Os algoritmos MaxMin2 e MaxMin3 são superiores ao algoritmo MaxMin1. O algoritmo MaxMin3 é superior ao algoritmo MaxMin2 com relação ao pior caso e bastante próximo quanto ao caso médio. 36

Exemplo: exercício da primeira aula f(n) = 7 int nronotas(int v[], int valor) { v[0] = valor/50; valor = valor%50; v[1] = valor/10; valor = valor%10 v[2] = valor/5; valor = valor%5; v[3] = valor; 37

Exemplo: exercício da primeira aula f(n) = 4 + 4 + 3*NúmeroNotas int nronotas(int v[], int valor) { v[0] = 0; v[1] = 0; v[2] = 0; v[3] = 0; while (valor >= 50) { v[0]++; valor = valor - 50; while (valor >= 10) { v[1]++; valor = valor - 10; while (valor >= 5) { v[2]++; valor = valor - 5; while (valor >= 1) { v[3]++; valor = valor - 1; 38

Perguntas?

O que é ter excelência? É uma atitude, um hábito!

Quem vê, entende... Quem faz, aprende!!!

Exercício void exercicio1 (int n) { int i, a; a = 0; i = 0; while (i < n) { a += i; i += 2; void exercicio2 (int n) { int i, j, a; a = 0; for (i = 0; i < n; i++) for (j = 0; j < i; j++) a += i + j; 42