Análise de Algoritmos Informações Gerais da Disciplina AULA 1 Profa. Sandra de Amo Disciplina: Análise de Algoritmos BCC - UFU Apresentação Geral do Curso Página web Bibliografia Material de Suporte Conteúdo Avaliação Aula 1: Qual o objetivo desta disciplina ? TODAS AS INFORMAÇÕES: www.deamo.prof.ufu.br/CursoAA2015-1.html Bibliografia Básica 1. S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani. Algorithms. McGraw-Hill Science/Engineering/Math; 1 edition (September 13, 2006). PDF Disponível online 2. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms, MIT Press, 3ª Edição, 2009. (Edição em portugues : “Algoritmos-Teoria e Prática”, Editora Campus 2003) PDF disponível online. 3. Donald E. Knuth. The Art of Computer Programming, Volume 4A: Combinatorial Algorithms,Part 1. (Series in Computer Science & Information Processing) Addison-Wesley Professional, 2011. 4. Vijay V. Vazirani. Approximation Algorithms. Addison-Wesley 2001 Bibliografia Complementar 1. David Harel and Yishai Feldman. Algorithmics: The Spirit of Computing, 3a Edição, Addison Wesley, 2004. 2. Steven S. Skiena: The Algorithm Design Manual. Springer, 2a Edição., 2008. 3. Bernhard Korte, Jens Vygen. Combinatorial Optimization: Theory and Algorithms (Algorithms and Combinatorics), 4a Edição, 2010. Material de Suporte Livro Texto Slides Conteúdo do Curso Parte I : Conceitos Básicos Problemas e Algoritmos Notação Assintótica Complexidade de Algoritmos - Complexidade de Problemas Projeto e Análise de um Algoritmo Algoritmos Recursivos Algoritmo Randômicos (Probabilísticos) - uma introdução Parte II: Algoritmos de Ordenação: Tempo não linear: ocupação otimal de espaço Tempo linear : ocupação não otimal de espaço Conteúdo do Curso (cont.) Parte IV: Algoritmos de Grafos Algoritmos elementares de busca em largura e em profundidade Caminhos mais curtos - Algoritmo de Dijkstra Técnica Gulosa para projeto de algoritmos Árvores Espalhadas - Algoritmos de Kruskal e Prim Parte V: Técnicas Avançadas de Projeto e Análise Programação Dinâmica (PD) Recursão versus PD Memoization Parte VI : Tópicos Avançados Problemas NP-completos Algoritmos Aproximativos Algoritmos Probabilisticos Critério de Avaliação Prova 1 : 6 de Maio Trabalho 1 : 8 de Maio 25 pontos 8 pontos Prova 2: 10 de Junho Trabalho 2: 12 de Junho 25 pontos 8 pontos Prova 3 : 15 de Julho Trabalho 3: 17 de Julho 25 pontos 9 pontos Prova Sub: 20 de Julho (segunda-feira = reposição de aulas das 6as feiras na UFU) Sobre o que é esta disciplina ? Problemas e suas soluções. Algoritmo = solução de um problema Antes de projetar um algoritmo para um problema: Analisar se o problema em questão tem solução Determinar a classe de complexidade do problema Projetar um algoritmo Analisar o algoritmo projetado Propor outras soluções mais eficientes Implementar a solução mais eficiente = disciplina “Teoria da Computação” Panorama Geral Problema P Projetar soluções mais eficientes Implementar a solução mais eficiente = disciplina “Análise de Algoritmos” = disciplinas de programação Analisar se P tem solução (algoritmica) Analisar complexidade de A Sim Determinar a dificuldade inerente do problema P (classe de complexidade de P) Projetar um Algoritmo A para resolver P (A compativel com a classe de complexidade de P) “Problemas” e “Algoritmos” O que é um problema ? Função P: Input Output Instância do Problema = I ϵ Input Tipos de Problemas Decisão, Otimização, ... Decisão: Output = Sim ou Não, I ϵ Input P(I) P (minimizar ou Otimização: existe uma função objetivo a otimizar maximizar). Output = valor que otimiza a função objetivo. Solúveis e Insolúveis ... Tratáveis e Intratáveis ... Exemplos de Problemas Busca de um elemento x em uma lista L ordenada Busca: (Listas X elementos) {Sim, Não} Busca(L,x) = Sim se x está em L; Não, caso contrário. Exemplo de instância do problema: L = [1, 3, 5, 10, 17], x = 12 Problema dos Primos Primos: N {Sim, Não} Exemplo de instância = 5 Primos(n) = Sim, se n é primo; Não, caso contrário Exemplos de Problemas Problema do Circuito Hamiltoniano Hamilton: Grafos Dirigidos {Sim, Não} Instância = grafo dirigido G Hamilton(G) = Sim, se G possui um caminho passando por todos os vértices uma única vez; = Não, caso contrário Problema da parada em um número determinado de passos Parada : (Programas, Inputs) {Sim, Não} Instância: (P,w) onde P = código de um programa , w = input de P Parada (P,w) = sim se P executado em w pára após 2^n passos, onde n = comprimento de w Parada (P,w) = não, em caso contrário. Problema de Correspondência de Post (PCP) Post: Dominós {Sim,Não} Instância= um conjunto de tipos de peças de dominós Post(D) = Sim, se existe um pareamento de peças de tipos em D = Não, caso contrário. O problema PCP Input = um conjunto finito de tipos de peças de dominós g abc bcd bcd fg eg b ef 1 2 3 … 4 ef cde n Pergunta : É possivel encontrar um pareamento, isto é, uma sequência de peças de tipos dados no input, tal que o string formado na parte de cima e idêntico ao string formado na parte de baixo ? bcdefg bcdefg Sequência : 3 n 1 Exemplos b a ca abc ca ab a c 1 2 3 4 abcaaabc abcaaabc Sequência de peças= 2 1 3 2 4 Exemplo Input abc ca acc ab a ba 1 2 3 Resposta ?? Não Justificativa : a parte de cima das peças é sempre maior que a parte de baixo ! Formalização do Problema Input genérico do Problema PCP C={ t1 b1 , t2 b2 , t3 b3 , … , tn bn } t1, t2, …, tn são strings sobre um alfabeto S b1, b2, …, bn são strings sobre um alfabeto S Um pareamento (match) = uma sequência <i1, i2, …, ik> de números em {1,…,n} tal que ti1 ti2 … tik = bi1 bi2 … bik = string do pareamento Pergunta : Existe um pareamento para o input C ? Hierarquia dos problemas dos exemplos (mais fáceis para mais difíceis) Problema Solúvel ? Complexidade do problema ? Busca Sim Polinomial Primos Sim Até 2003 ??? Em 2003: Polinomial Parada Sim Exponencial Hamilton Sim NP-completo Post Não “Problemas” e “Algoritmos” Solução de um Problema Conjunto finito de instruções cuja execução sobre o input termina depois de um tempo finito, produzindo no final o output. Algoritmo que resolve o problema Solução de um problema = algoritmo Algoritmo : conjunto finito de instruções que transformam uma entrada em uma saída depois de um tempo finito. Todo Algoritmo está associado a um Problema Perguntas Função injetora ?? Conjunto dos Algoritmos Conjunto dos Problemas ??? Não é função injetora: podem existir diferentes algoritmos para resolver um mesmo problema Não é função sobrejetora: Existem problemas que não têm solução = disciplina “Teoria da Computação” Panorama Geral Problema P Projetar soluções mais eficientes Implementar a solução mais eficiente = disciplina “Análise de Algoritmos” = disciplinas de programação Analisar se P tem solução (algoritmica) Analisar complexidade de A Sim Determinar a dificuldade inerente do problema P (classe de complexidade de P) Projetar um Algoritmo A para resolver P (A compativel com a classe de complexidade de P) Solução quando existe, não é única Problema da Ordenação Ordena : SeqNat SeqNat Ordena(<a1,...,an>) = <b1,...,bn> Onde: <b1,...,bn> é uma permutação de <a1,...,an> b1 ≤ b2 ≤ ... ≤ bn Algoritmos que o resolvem: Insertion-Sort Selection-Sort Bubble-Sort Eficiência em Heap-Sort Tempo cresce Merge-Sort Quick-Sort Radix-Sort Bucket-Sort Insertion-Sort Selection-Sort Bubble-Sort Heap-Sort Merge-Sort Quick-Sort Radix-Sort Bucket-Sort Eficiência em Espaço cresce O que é um bom algoritmo ? Correto ? Eficiente em tempo ? Para cada input I, o resultado produzido pelo algoritmo A(I) é exatamente o que se espera (A(I) = P(I)) O número de passos executado pelo algoritmo para produzir o resultado A(I) é uma função polinomial do tamanho do input I Eficiente em espaço ? O número de células de memória utilizadas pelo algoritmo para produzir o resultado A(I) é uma função polinomial do tamanho do input I O que é um bom algoritmo ? Correto Eficiente em tempo Critérios não são compatíveis ! Eficiente em espaço Soluções Aproximadas às vezes são mais interessantes do que as exatas ... Problema do Vertex Cover (problema de otimização) Achar o menor subconjunto de vértices S tal que cada aresta tem pelo menos uma de suas extremidades no conjunto S ? Problema de Minimização de recursos • Encontrar a solução ótima é difícil • Problema NP-hard • Encontrar solução aproximada é factível Existem algoritmos que encontram soluções aproximadas em tempo polinomial Para cada input G, o algoritmo dá uma solução com custo C(G) tal que: C(G) ≥ α Opt(G) Soluções Aproximadas nem sempre são facilmente encontráveis d3 Problema do Caixeiro Viajante (problema de otimização) d1 Achar o circuito hamiltoniano mais curto (passando por todas as cidades uma única vez) ? Problema de Minimização de recursos • Encontrar a solução ótima é difícil • Problema NP-hard • Encontrar solução aproximada não é factível ! d2 d4 d6 d5