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

Documentos relacionados
ANÁLISE DE ALGORITMOS: PARTE 3

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

Quantidade de memória necessária

7. Introdução à Complexidade de Algoritmos

Teoria da computabilidade Indecidíveis Decidíveis

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

4º 20/10/2003. ÍNDICE

Lista de Exercícios 6 Funções

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

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

Algoritmos Avançados Análise de Complexidade

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

Noções de complexidade de algoritmos

Complexidade de Algoritmos

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

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

Programação II Aula 07

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

ESCOLA SECUNDÁRIA DE LOUSADA

Método BubbleSort. Estrutura de Dados II Prof Jairo Francisco de Souza

Complexidade de Algoritmos

Planificação a médio e longo prazo. Matemática B. 11º Ano de escolaridade. Total de aulas previstas: 193. Ano letivo 2015/2016

Ordenação e Pesquisa de Dados. Aula 07 Insertion Sort e Bubble Sort

I. Correção de Algoritmos Não-Recursivos

CAPÍTULO 1 Operações Fundamentais com Números 1. CAPÍTULO 2 Operações Fundamentais com Expressões Algébricas 12

Aula 10: Tratabilidade

Agrupamento de Escolas do Fundão

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

FACULDADE CAMPO LIMPO PAULISTA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto a Análise de Algoritmos I Lista de Exercícios 1

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

Projeto de Algoritmos Introdução

5COP096 TeoriadaComputação

E. S. JERÓNIMO EMILIANO DE ANDRADE DE ANGRA DO HEROISMO. Conteúdo Programáticos / Matemática e a Realidade. Curso de Nível III Técnico de Laboratório

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

BCC202 - Estrutura de Dados I

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

Estudo heurístico de performance de estratégias de investimento simples baseadas na média móvel e desvio padrão no mercado ForEx

Programação Imperativa. Lição n.º 12 Arrays ordenados

Programação: Vetores

AGRUPAMENTO DE ESCOLAS ANSELMO DE ANDRADE

Metas/ Objetivos Conceitos/ Conteúdos Aulas Previstas

Instituto de Matemática e Estatística, UFF Março de 2011

Teoria da Computação. Aula 9 Pesquisa em Memória Secundária 5COP096. Aula 9 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Matriz de Referência da área de Matemática Ensino Fundamental

Projeto e Análise de Algoritmos

IME, UFF 7 de novembro de 2013

P L A N I F I C A Ç Ã 0 E n s i n o S e c u n d á r i o

Ordenar ou identificar a localização de números racionais na reta numérica.

BCC402 Algoritmos e Programação Avançada. Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Tóffolo 2011/1

Planificação Anual. 0,5 Geometria no plano e no espaço II. 32 Avaliações escritas e respetivas correcções. 5 Auto-avaliação

Matriz de Referência da área de Matemática Ensino Médio

Funções. Antonio Alfredo Ferreira Loureiro. UFMG/ICEx/DCC MD Funções 1

OBSERVAÇÕES: EXERCÍCIOS

MATEMÁTICA NÍVEL MÉDIO

Este conceito é bastante simples e será útil e conveniente nos itens seguintes, na definição das estruturas básicas de controle de execução.

Módulo 4 Ajuste de Curvas

PLANO DE ENSINO OBJETIVOS

Controle de Fluxo. Laços e Desvios incondicionais

MATRIZ DE REFERÊNCIA - SPAECE MATEMÁTICA 5 o ANO DO ENSINO FUNDAMENTAL TEMAS E SEUS DESCRITORES

Ajuste de mínimos quadrados

AGRUPAMENTO DE ESCOLAS ANSELMO DE ANDRADE

Universidade Federal de Alfenas

CÁLCULO. NÍVEL DE ENSINO: Graduação CARGA HORÁRIA: 80h PROFESSOR AUTOR: Jonas Lachini APRESENTAÇÃO

MATRIZES DE REFERÊNCIA COMPETÊNCIAS E HABILIDADES QUE SERÃO AVALIADAS: ENSINO FUNDAMENTAL I ANOS INICIAIS

Introdução à Neurociência Computacional (Graduação) Prof. Antônio Roque Aula 6

Análise de complexidade

UNIVERSIDADE FEDERAL DE SANTA MARIA COLÉGIO TÉCNICO INDUSTRIAL DE SANTA MARIA DEPARTAMENTO DE ENSINO CURSO TÉCNICO INTEGRADO EM ELETROTÉCNICA 1ºANO

Teoria da Correlação. Luiz Carlos Terra

Aula 2: Funções. Margarete Oliveira Domingues PGMET/INPE. Aula 2 p.1/57

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

C Operadores e Expressões

UNIVERSIDADE FEDERAL DE ALFENAS PROGRAMA DE ENSINO DE DISCIPLINA

Lógica de Programação Atividade Avaliativa 1 RESPOSTAS

EXERC EXAME DISCIPLINA: ALG ESTRUTURA DE DADOS I

Programação em C e C++ com Lógica. Subtítulo

NÚMEROS E ÁLGEBRA FUNÇÕES

OBJETIVOS DOS CAPÍTULOS

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO PRÓ-REITORIA DE ENSINO DE GRADUAÇÃO

Linguagem de Programação

SSC643 -Avaliação de Desempenho de Sistemas Computacionais Sarita Mazzini Bruschi

Métodos de Ordenação

MINICURSO. Uso da Calculadora Científica Casio Fx. Prof. Ms. Renato Francisco Merli

DEPARTAMENTO DE ESTATÍSTICA PLANO DE ENSINO FICHA N.º 1

TEMA I: Interagindo com os números e funções

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Linguagens de Programação. Marco A L Barbosa

Estatística Aplicada ao Serviço Social

AULAS 14 E 15 Modelo de regressão simples

Algoritmo e Linguagem C++

Conjuntos disjuntos. Relações de equivalência

O ESTUDO DAS FUNÇÕES INTRODUÇÃO

TEMA 2 PROPRIEDADES DE ORDEM NO CONJUNTO DOS NÚMEROS REAIS

EFICIÊNCIA DE ALGORITMOS E

1º ano. Capítulo 2 - Itens: todos (2º ano) Modelos matemáticos relacionados com a função logarítmica

Prof. Adriano Maranhão COMPILADORES

INF1007: Programação 2 7 Busca em Vetores. 01/04/2014 (c) Dept. Informática - PUC-Rio 1

Quicksort Letícia Rodrigues Bueno

7 Comandos e Estruturas de Controle

CURSO BÁSICO DE PROGRAMAÇÃO AULA 6. Revisão Laços de Repetição

ANÁLISE DE ALGORITMOS (INF 1721)

Transcrição:

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

Bibliografia T.H. Cormen, C.E. Leiserson and R.L. Rivest Introduction to algorithms R. Sedgewick and K. Wayne Algorithms D.E. Knuth The art of computer programming Vol. 3: Sorting and searching

Bibliografia complementar A. Drozdek Estrutura de dados e algoritmos em C++ N. Ziviani Projeto de Algoritmos Aulas de P. Feofiloff www.ime.usp.br/~pf/analise_de_algoritmos/lectures.html Simulação de algoritmos www.cs.usfca.edu/~galles/visualization/algorithms.html www.cs.princeton.edu/courses/archive/spr10/cos226/lectures.html www.jasonpark.me/algorithmvisualizer/?ref=producthunt

Primeiro bimestre Ordem de funções Algoritmos recursivos Estruturas de dados elementares Árvores balanceadas Ordenação Prova na 8 a semana Dia 20/09

Segundo bimestre Busca de padrões Algoritmos em grafos Paradigmas de programação Algoritmos paralelos Prova na 8 a semana Dia 22/11 Exame na 9 a semana Dia 29/11

CT-234 1) Ordem de funções Notação O (Big-Oh) e similares

Resultados experimentais Para resolver um problema, implemente um determinado algoritmo. Execute esse programa com diversas instâncias do problema (entradas com valores e tamanhos variados). Meça o tempo real dessas execuções. Desenhe um gráfico com os resultados obtidos. Tempo (ms) 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 50 100 Tamanho da entrada

Tempo de execução Tempo de execução 120 100 80 60 40 20 melhor caso caso médio pior caso O tempo de execução de um algoritmo varia (e normalmente cresce) com o tamanho da entrada do problema. Além disso, para instâncias de mesmo tamanho, também há variação no tempo de execução. Geralmente, o tempo médio é difícil de determinar. Costuma-se estudar os tempos máximos (pior caso): 0 1000 2000 3000 4000 é mais fácil de analisar; Tamanho da entrada é crucial para a qualidade das aplicações.

Análise teórica de complexidade Leva em consideração todas as possíveis entradas. Permite a avaliação do desempenho de um algoritmo, independentemente das características do hardware e do software utilizados.

Operações primitivas De modo geral, são as computações básicas realizadas por um algoritmo: Atribuição de valor para uma variável Comparação entre valores Cálculo aritmético Chamada de função etc. Sua definição exata não é importante. Apesar de serem obviamente diferentes, são contabilizadas como tempo unitário.

Exemplo de contagem O programa abaixo encontra o maior valor em um vetor de tamanho n: int arraymax (int A[], int n) { currentmax = A[0]; for (i=1; i<n; i++) { if (A[i] > currentmax) currentmax = A[i]; } return currentmax; } 1 atribuição e 1 indexação, 1 atribuição repete n-1 vezes [ 1 teste, 1 indexação e 1 teste, 1 atribuição e 1 indexação (no máximo), 1 incremento ] 1 teste, 1 return Total: 5 + (n-1).6 = 6n-1 Inspecionando o código, podemos calcular, em função de n, o número máximo de operações primitivas executadas.

Estimativa do tempo de execução No pior caso, o algoritmo arraymax executa 6n-1 operações primitivas. Definições: a : tempo gasto na execução da operação primitiva mais rápida b: tempo gasto na execução da operação primitiva mais lenta Seja T(n) o tempo real de execução de pior caso de arraymax. Portanto, a.(6n-1) T(n) b.(6n-1) O tempo de execução T(n) é limitado por duas funções lineares.

Taxa de crescimento do tempo de execução Alterações nos ambientes de hardware ou software: afetam T(n) apenas por um fator constante; não alteram a taxa de crescimento de T(n): continua linear! Portanto, a linearidade de T(n) é uma propriedade intrínseca do algoritmo arraymax. Cada algoritmo tem uma taxa de crescimento que lhe é intrínseca. O que varia, de ambiente para ambiente, é somente o tempo absoluto de cada execução, que depende de fatores relacionados com o hardware e o software utilizados.

Taxas de crescimento Exemplos de taxas de crescimento: Linear n Quadrática n 2 Cúbica n 3 No gráfico log-log ao lado, a inclinação da reta corresponde à taxa de crescimento da função. T (n ) 1E+30 1E+28 1E+26 1E+24 1E+22 1E+20 1E+18 1E+16 1E+14 1E+12 1E+10 1E+8 1E+6 1E+4 1E+2 1E+0 Cúbica Quadrática Linear 1E+0 1E+2 1E+4 1E+6 1E+8 1E+10 n

Taxas de crescimento A taxa de crescimento não é afetada por: fatores constantes; fatores de ordem mais baixa. Exemplos: 10 2 n + 10 5 : é uma função linear 10 5 n 2 + 10 8 n: é uma função quadrática 10-9 n 3 + 10 20 n 2 : é uma função cúbica

Notação O (Big-Oh) Dadas as funções f(n) e g(n), dizemos que f(n) é O(g(n)) se existem duas constantes positivas c e n 0 tais que f(n) c.g(n), "n n 0 10.000 1.000 100 3n 2n+10 n Exemplo: 2n + 10 é O(n) 2n + 10 cn (c - 2)n 10 n 10/(c - 2) Uma possível escolha: c = 3 e n 0 = 10 10 1 1 10 100 1.000 n Basta que essas constantes existam!

Lembretes sobre a notação O Uma função f(n) é O(g(n)) se, para todo n suficientemente grande, f(n) não é maior que c.g(n), onde c > 0 f(n) é O(g(n)) ou f(n) = O(g(n)) na realidade significam f(n) Î O(g(n))

Muita atenção! No uso da notação O, costuma ocorrer um abuso de linguagem : o sinal de igualdade não tem o seu significado habitual. 10 n 2 + 10 log n = O(n 2 ) 2 n 2 3 = O(n 2 ) 10 n 2 + 10 log n = 2 n 2 3

Um exemplo n 2 não é O(n) n 2 cn n c A inequação acima não pode ser sempre satisfeita, pois c é uma constante e n não Qualquer c escolhido poderia ser superado por n: basta escolher n 0 = c+1 1.000.000 100.000 10.000 1.000 100 10 1 n^2 100n 10n n 1 10 100 1.000 n

Outros exemplos f(n) = 12n + 1500 É O(n 2 )? 20.000 18.000 16.000 14.000 12.000 10.000 8.000 6.000 4.000 2.000 - f(n) 15 n 2 2 n 2 Sim! n f(n) = 12 n + 1500 2 n^2 15 n^2

Outros exemplos f(n) = 144 n 2 12 n + 50 É O(n 2 )? 300.000 250.000 200.000 150.000 100.000 200 n 2 Sim! 50.000 0 1 4 7 10 13 16 19 22 f(n) 25 28 31 20 n 2 34 n f(n) = 144 n2-12 n + 50 20 n^2 200 n^2

Outros exemplos f(n) = n 3 /100 + 3 n 2 É O(n 2 )? 6.000 5.000 4.000 3.000 2.000 1.000-1 4 7 10 13 16 19 f(n) 22 25 28 31 4 n 2 2 n 2 34 Sim? Será??? n f(n) = n3/100 + 3 n2 2 n^2 4 n^2

Outros exemplos f(n) = n 3 /100 + 3 n 2 É O(n 2 )? 90.000 80.000 70.000 60.000 50.000 4 n 2 Não!!! 40.000 30.000 20.000 10.000 f(n) 2 n 2-1 13 25 37 49 61 73 85 97 109 121 133 n f(n) = n3/100 + 3 n2 2 n^2 4 n^2

A notação O e a taxa de crescimento A notação O fornece um limite superior para a taxa de crescimento de uma determinada função. A afirmação f(n) é O(g(n)) significa que a taxa de crescimento de f(n) não é maior que a de g(n). A notação O permite ordenar as funções de acordo com as suas correspondentes taxas de crescimento. f(n) é O(g(n))? g(n) é O(f(n))? Se g(n) cresce mais que f(n): Sim Não Se f(n) cresce mais que g(n): Não Sim Se f(n) e g(n) têm a mesma taxa: Sim Sim

Hierarquia de funções Com relação às funções polinomiais, é fácil concluir que O(n) Ì O(n 2 ) Ì O(n 3 ) Ì O(n 4 ) Ì O(n 5 ) Ì O(n 3 ) O(n 2 ) O(n)

Algumas dicas sobre a notação O No uso da notação O, consideramos apenas valores suficientemente grandes de n, ou seja, n Se p(n) é um polinômio de grau k, então p(n) é O(n k ) Pode-se descartar seus termos de menor ordem, inclusive as constantes. Convém utilizar a menor ordem: 2n é O(n) é preferível a 2n é O(n 2 ) 3n + 5 é O(n) é preferível a 3n + 5 é O(3n)

Exemplos 6n 4 + 12n 3 + 12 ÎO(n 4 ) ÎO(n 5 ) ÏO(n 3 ) 3n 2 + 12n.log n ÎO(n 2 ) ÎO(n 4 ) ÏO(n.log n) 5n 2 + n(log n) 2 + 12 ÎO(n 2 ) ÎO(n 3 ) ÏO(n.log 9 n) log n + 4 ÎO(log n) ÎO(n) log k n, k>1 ÎO(n) ÏO(log n)

Comparações entre funções 5 4 log 2 N Tempo de execução 4 3 3 2 log N 2 1 C 1 0 Entrada: N Constante: c Logarítimico: log N Log- quadrado: log2 N

Comparações entre funções Tempo de execução 90 80 70 60 50 40 30 20 10 0 0 1 5 10 15 20 25 30 35 40 45 50 Entrada: N Constante: c Logarítmico: log N Log-quadrado: log2 N Linear: N N log N N log N N log 2 N log N Constante

Comparações entre funções 35000 Tempo de execução 30000 25000 20000 15000 2 N 10000 5000 N 3 N 2 0 0 1 5 10 15 Entrada: N Quadrática: N 2 Cúbica: N 3 Exponencial: 2 N

Comparações entre funções A partir da notação O, é possível estabelecer uma hierarquia entre as funções: Constante O(1) Logarítmica O(log n) Linear O(n) n.log n O(n.log n) Quadrática O(n 2 ) Cúbica O(n 3 ) Polinomial O(n k ), com k 4 Exponencial O(k n ), com k > 1 Maior ordem Evidentemente, as funções lineares, quadráticas e cúbicas também são polinomiais...

Análise assintótica de algoritmos A análise assintótica de algoritmos descreve o tempo de execução em notação O. Para realizar a análise assintótica de um algoritmo: Calcula-se o número de operações primitivas executadas como função do tamanho da entrada. Expressa-se esta função na notação O. Exemplo: O algoritmo arraymax executa no máximo 6n-1 operações primitivas. Dizemos que o algoritmo arraymax gasta tempo O(n), ou seja, sua complexidade de tempo é linear.

Notação O na análise de algoritmos Em comandos condicionais, o tempo total corresponde à execução do teste mais o tempo do bloco mais lento. if (x == y) dosomething(); else dosomethingelse(); Chamadas de funções: corresponde ao tempo de execução da função chamada (não ao tempo da chamada em si, que é descartado).

Notação O na análise de algoritmos Em comandos consecutivos, somam-se os tempos: for (int x=1; x <= n; x++) O(n) <operação primitiva qualquer>; for (int x=1; x <= n; x++) for (int y=1; y <= n; y++) O(n 2 ) <operação primitiva qualquer>; Tempo total: O(n) + O(n 2 ) = O(n 2 ) E se o laço for mais interno começasse com y=x? Qual o tempo total gasto pelo laço abaixo? for (int x=1, int y=1; y <= n; x++) { <operação primitiva qualquer>; O(n 2 ) if (x==n) { y++; x=1; } }

Exercícios Elabore um algoritmo paralelo para encontrar o maior valor presente em um vetor de n posições. Dica: utilize n processadores. Qual a complexidade de tempo desse algoritmo? Haveria outros algoritmos mais eficientes ou que utilizassem menos processadores? Dica: divida o vetor em blocos de tamanho O(log n).

Limites inferiores Enquanto a notação O fornece limites superiores para o crescimento das funções, também há outras notações que oferecem mais informações interessantes. Seja Ω(g(n)) o conjunto de funções f(n) para as quais existem constantes positivas c e n 0 tais que f(n) c.g(n), "n n 0. A notação Ω fornece um limite inferior para o crescimento das funções.

Exemplos f(n) = 12n 2 10 Î Ω(1) f(n) = 12n 2 10 Î Ω(n) f(n) = 12n 2 10 Î Ω(n 2 ) Entretanto, f(n) = 12n 2 10 Ï Ω(n 3 )

Na prática Na notação Ω, convém utilizar a maior função possível: É correto dizer que f(n) = 3n 2 + 10 é Ω(1), mas representa pouca coisa sobre f(n) Analogamente, f(n) = Ω(g(n)) significa que f(n) Î Ω(g(n)).

Limites inferiores e superiores Quando uma função pertence simultaneamente a O(g(n)) e a Ω(g(n)), dizemos que f(n) Î Θ(g(n)). f(n) Î Θ(g(n)) Û f(n) Î (O(g(n)) Ω(g(n))) f(n) Î Θ(g(n)) Û f(n) Î Θ(g(n)) Û f(n) Î O(g(n)) e g(n) Î O(f(n)) f(n) Î Ω(g(n)) e g(n) Î Ω(f(n)) Mais precisamente, Θ(g(n)) é o conjunto de todas as funções f(n) para as quais existem constantes positivas c 1, c 2 e n 0 tais que: c 1.g(n) f(n) c 2.g(n), "n n 0

Análise assintótica de algoritmos Basicamente, podemos dizer que f(n) é Θ(g(n)) se e somente se: lim n (f(n)/g(n)) = c, onde c > 0 Por outro lado: Se lim n (f(n)/g(n)) = 1, dizemos que f(n) ~ g(n) Se lim n (f(n)/g(n)) = 0, dizemos que f(n) é o(g(n)) Se lim n (f(n)/g(n)) =, dizemos que f(n) é ω(g(n))

Análise assintótica de algoritmos É possível fazer uma analogia entre a comparação assintótica de duas funções f e g e a comparação de dois números reais a e b. f(n) = O(g(n)) a b f(n) = Ω(g(n)) a b f(n) = Θ(g(n)) a = b f(n) = o(g(n)) a < b f(n) = ω(g(n)) a > b

Alguns exemplos 6n 4 + 12n 3 + 12 ÎΘ(n 4 ) Îo(n 5 ) Ïω(n 5 ) 3n 2 + 12n.log n ÎΘ(n 2 ) ÎΩ(n) ÏO(n.log n) 5n 2 + n(log n) 2 + 12 ÎΘ(n 2 ) Îω(n.log 2 n) ÏΩ(n 3 ) log n + 4 ÎΘ(log n) Ïo(log n) log k n, k>1 ÏΘ(n) Îo(n)

Lower e upper bounds Dado um determinado problema P, chamamos de: UB(P) ou upper bound de P: a complexidade do melhor algoritmo conhecido que o resolve. LB(P) ou lower bound de P: a complexidade mínima necessária em qualquer de suas resoluções. Deseja-se: UB LB Limite prático Limite teórico Um problema P pode ser considerado computacionalmente resolvido se UB(P) Î Θ(LB(P))

Conclusões Na análise de complexidade de um algoritmo, estamos mais interessados no seu comportamento geral que em outros detalhes (que dependem da máquina, do sistema operacional, da linguagem ou dos compiladores, etc.). Procura-se medir a complexidade de um algoritmo em função de um parâmetro do problema, que geralmente é o tamanho da sua entrada. O que se costuma considerar é a eficiência assintótica dos algoritmos executados em máquinas que operam no tradicional modelo de acesso aleatório.