Complexidade de Algoritmos alvaro_degas@yahoo.com.br
Complexidade de Algoritmos Seqüência de passos conhecidos Finitos Entrada ® Processamento ® Saída Mesmo que “se confunda” no tempo Tem que ter uma saída Problema da Parada
Algoritmos Algoritmos (definições) Procedimento computacional que recebe uma entrada e produz uma saída Seqüência de passos que transformam entrada em saída Máquina de Turing que transforma uma entrada M numa saída S
Complexidade Algoritmos podem ser mais ou menos eficientes Ortogonal à computabilidade Podemos otimizar nossos códigos! Busca Seqüencial X Busca Binária Bubble Sort X Quick Sort
Tipos de Complexidade Algoritmos podem ser mais ou menos eficientes com respeito a Tempo: quanto tempo será necessário para que o algoritmo termine e dê a resposta? Espaço: quanto de espaço será necessário para que o algoritmo possa trabalhar e dar a resposta?
Exemplo Em bancos de dados: Outros exemplos Uma busca usando índice B+Tree Mais rápida (mais eficiência no tempo) Mais espaço (menos eficiência no espaço) Outros exemplos Árvores X Ordenação Ordenação em disco
Exemplo práticos Qual a complexidade temporal da busca seqüencial? E da busca binária? Qual a complexidade temporal do Bubble Sort? E do Merge Sort?
Notação O(n) Sejam duas funções g(n) e f(n) Diz-se que g(n) = O(f(n)) sse há algum C tal que g(n) = c·f(n) Exemplo: 3n = O(n) 4n2 -2n + 7 = O(n2) 176.439log10(n)/3 = O(log(n))
Notação O(n) Porque O(n) é importante? n2 e n2 + 18876547n geram valores diferentes Mas padrões de crescimento iguais! Para N muito grande (digamos 1.000.000.000.000) n2 = 1x1024 e n2 + 18876547n = 1x1024+18876547x1012 Quanto 18876547x1012 é significativo no final?
Padrões importantes Certos tipos de complexidade são importantes Caracterizam classes de problemas particulares Facílimos, Muito fáceis, Fáceis, Difíceis, Muito difíceis, etc. e os intratáveis!
Padrões importantes O(1) – tempo constante: facílimo O(log n) – logarítmica: muito fácil O(n) – linear: fácil O(n log n) – polinomial-logaritmico:fácil O(nm) – polinomial: difícil O(n!) – fatorial (exponencial): intratáveis! O(mn) – exponencial: intratáveis!
Gráfico Comparativo
Gráfico Comparativo
Gráfico Comparativo
Gráfico Comparativo
Importância da complexidade O que são elementos de hardware e de software Um exemplo: ordenação Computador A – Um bilhão de comparações por segundo (1012) Ordenação por inserção Computador B – Dez milhões de comparações por segundo (1010) Ordenação rápida (Quick Sort)
Importância da complexidade Complexidade dos algoritmos Quick Sort: O(n log n) Insertion Sort: O(n2) Ordenar 1 milhão de números (n=106) Computador A: (106)2/1012 = 1seg Computador B: 106xlog106/1010 = 6x10-9seg E se fosse para ordenar um trilhão de números (n=1015)?
Importância da complexidade Outro exemplo – determinante de matrizes Calcular o determinante de uma matriz quadrada de ordem n (MNxN) Método de Gauss: 4n3+9n2-7n)/6 = O(n3) Método de Crammer: (n+1)!(e-1) = O(n!)
Importância da complexidade Crammer Gauss 2 3 4 5 2,35ms 10 1,19min 4,95ms 20 15225 séculos 38,63ms 40 5,1033 séculos 0,315s 50 102 159 456 353 666
Classes de problemas Problemas polinomiais Problemas para os quais se conhece algoritmo polinomial para resolver O(nk) ou inferior Classe P
Classes de problemas Problemas polinomiais não determinísticos Problemas para os quais não se conhece solução determinística senão exponencial O(kn) ou que o valha (O(n!), etc) Classe NP P Ì NP (todo problema P admite solução exponencial!)
Problemas da classe NP O problema do caixeiro viajante (simplificado) Percorrer todas as cidades com mais de 200 mil habitantes do interior da Bahia andando o mínimo possível, começando em Ilhéus, sem passar duas vezes na mesma cidade! E se não se fixar a cidade de origem?
Como fica Cidades: Possíveis trajetos? Distâncias? Feira de Santana Vitória da Conquista Itabuna Ilhéus Possíveis trajetos? Distâncias?
Distâncias Km FSA VCO ITA IOS - 400 360 390 240 270 30
Como escolher? Gerar todos os trajetos possíveis e comparar seus custos – Método Algoritmico Dados C: Conjunto de cidades consideradas R e Rmenor: Listas encadedadas de cidades (rotas) R.Tamanho(T): Retorna o tamanho da rota R usando T T: Tabela de distâncias entre as cidades
Como escolher? Algoritmo Inicio C Todas as Cidades R.Criar( ) /*Cria a rota R vazia */ MenorTamanho = GerarRotas (C, R, Rmenor, MenorTamanho) Retorna Rmenor Fim
Como escolher? Gerar_Rotas (C, R, Rmenor, MenorTamanho) Se C então Para cada cidade c C faça R.Incluir(c) C’ = C – {c} Gerar_Rotas (C’, R, Rmenor, MenorTamanho) R.Excluir(c) Senão Se R.Tamanho(T) < MenorTamanho então Rmenor = R MenorTamanho = R.Tamanho(T) Fim_Gerar_Rotas
Como escolher? Gera todos os trajetos possíveis e comparar seus custos IOS/FSA/VCO/ITB: 390+400+240 = 1030 IOS/FSA/ITB/VCO: 390+360+240 = 990 IOS/ITB/FSA/VCO: 30+360+400 = 790 IOS/VCO/ITB/FSA: 270+240+360 = 870 IOS/VCO/FSA/ITB: 270+400+360 = 1030 IOS/ITB/VCO/FSA: 30+240+400 = 670
Performance! Quantos trajetos? Quantas cidades? 3 cidades, 6 trajetos, (3!) Cidades maiores do que 1000 habitantes 360 cidades, 3,98x10765 (360!) trajetos Um computador (jamais construído) que possa gerar 10500 trajetos por segundo: 1,26x10256 séculos!
Outros problemas da classe NP Gerenciamento de filas para uso de CPU (escalonamento) Gerenciamento de memória (fragmentação) Otimização de consultas em SGBDs Localização de recursos em Sistemas Distribuídos.
Como tratar problemas NP Heurísticas Técnicas de programação (meta-heurísticas) Abrir mão da “melhor” solução Garantir uma “boa” solução (possivelmente a melhor) Tempo de execução polinomial
Método Guloso Começa em algum ponto Escolhe, na vizinhança, qual o ponto mais “barato” a percorrer Repete a escolha até que não haja mais nenhum Pode (ou não) resultar no melhor caso, em problemas da classe P Problema do troco
Método Guloso No exemplo: saindo de Ilhéus Escolhe Itabuna (30Km) Escolhe Vitória da Conquista (240Km) Escolhe Feira de Santana (400) Total: 670 Melhor escolha? Sempre?
Método Guloso
Método Guloso
Método Guloso
Método Guloso
Método Guloso
Método Guloso
Dividir para Conquistar Parte do princípio de que unir duas melhores soluções parciais resulta na melhor solução global N cidades K grupos de N/K cidades Resolve os K grupos “Une” a solução Pode (ou não) resultar no melhor caso, em problemas da classe P Torre de Hanoi, Ordenação
Dividir para conquistar No exemplo: dois grupos ({Ilhéus, Itabuna} e {Vit. Conquista, Feira de Santana}) Ilhéus – Itabuna (30Km) Vit. Conquista – Feira de Santana (400Km) “Unir”: Itabuna-Feira (390) ou Itabuna- Conquista (240) Total: 670 Melhor solução? Sempre?
Programação Dinâmica Quando uma seqüência de decisões locais não gera uma solução ótima Gerar todas as seqüências: exponencial Princípio: Se i, i1, i2, i3, ..., ik, j é a melhor solução entre i e j então i1, i2, ... ik é a melhor solução entre i1 e ik. Requer um conhecimento prévio (heurística)
Programação Dinâmica No exemplo: sabe-se que a melhor divisão em dois grupos é (Ilhéus, Itabuna e Vit. Conquista, Feira de Santana) Ilhéus – Itabuna (30Km) Vit. Conquista – Feira de Santana (400Km) “Unir”: Itabuna-Feira (390) ou Itabuna-Conquista (240) Total: 670 Melhor solução? Proporcional ao conhecimento prévio (Background Knowledge)!
BackTracking Soluções restritas Gerar árvore de soluções até que Uma resposta que satisfaça seja encontrada Não se possa mais alcançar resposta satisfatória No segundo caso há um retorno e toma-se outro caminho O problema das 8 rainhas
BackTracking Soluções com custo inferior a 800 IOS/FSA/VCO/ITB: 390+400+240 = 1030 IOS/FSA/ITB/VCO: 390+360+240 = 990 IOS/ITB/FSA/VCO: 30+360+400 = 790 Solução ok! Total: 790 Encontra a primeira solução “satisfatória”, se houver.
NP-Completos Intratabilidade Problemas intratáveis Indecidibilidade (Problema da Parada, Fermat, etc) Problemas decidíveis mas não polinomiais Problemas decidíveis e “aparentemente” não polinomiais
NP-Completos Objetivo: encontrar problemas “equivalentes” em complexidade Dicas sobre como resolvê-los (ou não resolvê-los) Redução: mapeamento entre dois problemas 1 “engloba” 2 1 é pelo menos tão difícil quanto 2
Exemplo de redução 1: Caixeiro viajante 2: Desfragmentar memória Escolher Arquivo = Escolher Trecho Possibilidades de organização dos arquivos = Possíveis rotas Melhor conjunto de rotas X Seqüência (desfragmentada) de arquivos 2 engloba 1 Se houver solução polinomial para o caixeiro viajante...
Definições P: classe de problemas resolvíveis em tempo polinomial num computador determinístico NP: classe de problemas resolvíveis em tempo polinomial em um computador não determinístico (NP: Non-deterministic Polinomial)
Mais resultados NP é “polinomialmente verificável”, i.e. há algoritmos polinomiais para verificar uma solução de problemas em NP Sabe-se que P NP (mais precisamente P NP) Mas não se sabe se P=NP ou se PNP Acredita-se que PNP
P e NP P NP
Problemas Intratáveis A suposição de que PNP nos leva a questionar: Quem são os problemas do conjunto NP – P? Problemas intratáveis!
Teorema de Cook Se 1 2 (1 é redutível a 2 em tempo polinomial) e 2 P então 1 P Satisfatibility: Problema que Cook mostrou que todos os problemas em NP podem ser reduzidos a ele em tempo polinomial Há outros problemas com essa mesma característica: os NP-Completos
Propriedades dos NP-Completos Se 1 NPC e 2 NPC então 1 e 2 são mutuamente redutíveis em tempo polinomial Se algum problema em NP for mostrado intratável, todos os problemas NPC também o serão, e o mesmo se dá no caso da tratabilidade Ou seja: seja um problema NPC tem-se que, P P NP Mas não se provou nada até hoje
Mundo NP (suposto) P NP NPC
Para que tudo isso? Respondamos à seguinte questão: Os problemas NP-Completos são intratáveis? Há centenas de problemas NP-Completos conhecidos Se é NP-Completo Ou usa-se uma heurística Ou espera-se uma revolução em Ciência da Computação
Para que servem os NP-Completos? Como provar que um problema é NP- Completo? Mostra que NP Seleciona algum problema NPC ’ Constrói uma transformação de em ’ Mostra que é polinomial Problemas intratáveis podem ser úteis?
Complexidade de Algoritmos. FIM! “De vez em quando tropeçamos na verdade, mas normalmente levantamos e seguimos em frente!” Lei de Murphy aplicada ao ser humano Escher