Prévia do material em texto
Análise Complexidade Algoritmos SLIDE 0 julioc.silva@pitagoras.com.br Professor Professor Júlio Cesar da Silva Graduado Exatas, TI e Filosofia MBA, Mestre e Doutorando Professor para Graduação desde 2011 Atua também com Tutoria de carreira, Consultoria Scrum Bloger : www.esc larec imentofilosofico.org / www.logica.mat.br YouTuber: Canal “Tem Lógica” Interesses: Scrum, Lógica, Pensamento Crítico e Livros julioc.silva@pitagoras.com.br http://www.esclarecimentofilosofico.org http://www.logica.mat.br Avaliação Continuada Avaliação Continuada Atividades e Pontuação Atividades: (Etapa 1/Etapa2) Exercícios em sala: 60% Mapas Mentais: 40% Avaliações 30% questões conceituais 40% questões intermediarias 30% ENADE Apresentação da Disciplina Unidade 1 | ALGORITMOS POLINOMIAIS EM LINGUAGEM DE PROGRAMAÇÃO DE CIÊNCIA DA COMPUTAÇÃO U n i d a d e 2 | C OM P L E T U D E E COMPLEXIDADE EM COMPUTABILIDADE Unidade 3 | FUNDAMENTOS A CIENCIA DA COMPUTAÇÃO E COMPUTABILIDADE U n i d a d e 4 | O T I M I Z A Ç Ã O E COMPLEXIDADE EM COMPUTABILIDADE Visão Geral Os algoritmos fazem parte do dia-a-dia das pessoas. Exemplos de algoritmos: instruções para o uso de medicamentos; indicações de como montar um aparelho; receitas. Visão Geral Segundo Dijkstra, um algoritmo corresponde a uma descrição de um padrão de comportamento, expresso em termos de um conjunto finito de ações. Executando a operação a + b percebemos um padrão de comportamento, mesmo que a operação seja realizada para valores diferentes de a e b. Visão Geral Executando a operação a + b percebemos um padrão de comportamento, mesmo que a operação seja realizada para valores diferentes de a e b. Qual é o padrão para este caso? R: sequência de passos 1) Ler duas entradas (números inteiros) 2) Calcular a soma das duas entradas 3) Retornar o resultado da soma Visão Geral Definição: um algoritmo é um conjunto finito de instruções precisas para executar uma computação. Um algoritmo pode ser visto como uma ferramenta para resolver um problema computacional bem especificado Visão Geral Análise: exame de cada uma das partes de algo composto . Complexidade: algo que seja complexo, que abrange ou encerra muitos elementos ou partes. Visão Geral Computação: relativo a eficiência em que um algoritmo é executado sobre um computador, medição da velocidade e do desempenho. Visão Geral Compu tab i l i d ade : a va l i a ção de algoritmos em função da computação destes por um computador. Computável: fornece a saída correta para cada entrada válida Não-computável: trava para alguma entrada. Visão Geral Visão Geral Um algoritmo não existe, ou seja, não é possível escrevê-lo, se antes não for definido o modelo computacional associado (como será executado). Visão Geral Visão Geral Deve-se definir um repertório finito de regras: As linguagens de programação. A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação: As estruturas de dados. Visão Geral Tempo finito não é uma eternidade: A maior parte das pessoas não está interessada em algoritmos que levam anos, décadas, Séculos, milênios para executarem. Visão Geral Existem diferentes “tipos de computadores”. Existem diferentes modelos computacionais: RAM, PRAM, de pilha, de registro Visão Geral Questão decorrente: Dado um problema qualquer, existe sempre um algoritmo que pode ser projetado para um dado modelo computacional? Visão Geral Visão Geral Visão Geral Visão Geral Visão Geral Visão Geral Visão Geral Visão Geral O problema é chegar com algoritmos que os generais podem usar, incluindo o envio de mensagens e o processamento de mensagens recebidas, que pode permiti- los concluir corretamente: Sim, vamos atacar na hora marcada. Visão Geral A partir daí é bastante simples para os generais chegarem a um acordo sobre a hora de atacar (i.e. uma mensagem bem sucedida, com conf i rmação bem sucedida). Visão Geral Porém, a sutileza do Problema dos Dois Generais está na impossibilidade de projetar algoritmos que sejam utilizados pelos generais para concordar de forma segura com o enunciado acima. Visão Geral O primeiro general pode começar enviando uma mensagem "Ataque às 06:00 em 4 de agosto." No entanto, uma vez enviada, o primeiro general não tem ideia se o mensageiro entregou ou não. Essa incerteza pode levar o primeiro general a hesitar a atacar, devido ao risco de ser o único atacante. Visão Geral Para ter certeza, o segundo general pode enviar uma confirmação de volta para o primeiro: "eu recebi a sua mensagem e iremos atacar às 06:00 em 4 de agosto." No entanto, o mensageiro carregando a confirmação pode ser capturado e o segundo general pode hesitar, sabendo que o primeiro não faria nada sem a sua confirmação. Visão Geral Assim, rapidamente se torna evidente que não importa quantas rodadas de confirmação sejam feitas, não há maneira de garantir a segunda condição, de que cada general está ciente de que o outro concordou no plano de ataque. Seja qual for o general, que envie o último mensageiro, sempre estará na dúvida se o mensageiro entregou ou não. Inspirações Análise Complexidade Algoritmos SLIDE 1 julioc.silva@pitagoras.com.br Revisão Visão Geral Revisão Questão decorrente: Dado um problema qualquer, existe sempre um algoritmo que pode ser projetado para um dado modelo computacional? Algoritmo Etapas no desenvolv imento de algoritmos: Definição do problema Definição de um modelo do problema Especificação do algoritmo Desenho do algoritmo Verificação da corretude do algoritmo Análise do algoritmo Implementação do algoritmo Teste do algoritmo Documentação do algoritmo Algoritmo Inspirações Modelo Computacional Modelo: Esquema que possibilita a representação de uma entidade (Houaiss). No modelo, só se deve incluir o que for relevante para a modelagem do Objeto em questão. Compu t a c i o n a l : R e l a t i v o a o processamento (Houaiss.) Modelo Computacional Modelo computacional: Esquema que descreve como é o modelo abstrato do processamento de algoritmos. Modelo abstrato: define uma abstração do mundo real Processamento de algoritmos: a forma como os algoritmos são p rocessados/executados por computadores ou por um modelo computacional Modelo Computacional Importância: um algoritmo não existe, ou seja, não é possível escrevê- lo, se antes não for definido o modelo computacional associado (como será executado). Define o conceito básico no projeto de qualquer algoritmo. Modela o computador tradicional e outros elementos computacionais. Inspirações Inspirações Inspirações Modelo Computacional Análise de Algoritmos: técnicas e metodologias para avaliar a complexidade de um dado algoritmo computacional: Notações/ordens de complexidade Técnicas de análise de algoritmos Paradigmas de projeto de algoritmos Teoria da complexidade computacional Modelo Computacional Classes de complexidade em algoritmos: definem classes de categorização de complexidades para os algoritmos Constante (1): acesso a uma posição específica do vetor Logarítmica (logn): busca binária Linear (n): busca sequencial LogLinear (nlogn): MergeSort, QuickSort Quadrática (n2): SelectionSort, InsertSort Cúb i ca ( n3 ) : b u s ca em uma mat r i z tridimensional Fatorial (n!): Fibonacci Exponencial (kn): caixeiro viajante por força bruta Inspirações Modelo Computacional100 milhões de operações são executadas em 1 segundo. Modelo Computacional As técnicas matemáticas permitem efetuar uma análise precisa de algoritmos computacionais Somatórios e produtórios Equações de recorrência Resolução de equações de recorrência Expansão telescópica Substituição Arvores de recursão Teorema mestre Inspirações Inspirações Modelo Computacional Paradigmas de projeto em algoritmos: fornecem técnicas de projeto de algoritmos para a resolução de problemas. Modelo Computacional Paradigmas de projeto em algoritmos: Os padrões descrevem técnicas genéricas para a resolução de problemas Oferecem técnicas genéricas de projeto e implementação de algoritmos Modelo Computacional Paradigmas de projeto em algoritmos: As técnicas estão relacionadas com a natureza do problema. Exemplo: como resolver problemas que podemos descrever sua soluções em caminhos em árvores? Modelo Computacional Teoria da Computabilidade: teoria da complexidade computacional. Ramo da teoria da computação e matemática que foca na classificação de problemas computacionais de acordo com sua d i f i cu ldade aparente , relacionando as classes entre si. Máquina de Turing e computabilidade em algoritmos. Completude NP. Modelo Computacional Exercícios de Fixação 1. Qual a melhor definição para algoritmo? 2. Defina o que é um modelo computacional e qual a sua relação com os algoritmos. 3. Qual a diferença entre RAM e PRAM? 4. Implemente um algoritmo em C que leia um vetor com cinco posições, em cada posição existe um número. Após a leitura o algoritmo deve somar os dois maiores valores. Análise Complexidade Algoritmos SLIDE 1 julioc.silva@pitagoras.com.br Revisão 1. Qual a melhor definição para algoritmo? 2. Defina o que é um modelo computacional e qual a sua relação com os algoritmos. 3. Qual a diferença entre RAM e PRAM? 4. Implemente um algoritmo em C que leia um vetor com cinco posições, em cada posição existe um número. Após a leitura o algoritmo deve somar os dois maiores valores. Revisão 1. Qual a melhor definição para algoritmo? Definição: um algoritmo é um conjunto finito de instruções precisas para executar uma computação. Um algoritmo pode ser visto como uma ferramenta para resolver um p rob lema computac iona l bem especificado . Revisão 2. Defina o que é um modelo computacional e qual a sua relação com os algoritmos. Um algoritmo não existe, ou seja, não é possível escrevê-lo, se antes não for definido o modelo computacional associado (como será executado). O mode l o d e f i n e o q ue é o computador e como este executa o algoritmo. Revisão 3. Qual a diferença entre RAM e PRAM? RAM: Acesso randômico a uma única estrutura de memória. PRAM: Acesso randômico em paralelo a um conjunto de memória. Revisão 4. Implemente um algoritmo em C que leia um vetor com cinco posições, em cada posição existe um número. Após a leitura o algoritmo deve somar os dois maiores valores. Complexidade no Tempo e no Espaço. A avaliação do desempenho de um algoritmo quanto executado por um computador pode ser feita a posteriori ou a priori. Complexidade no Tempo e no Espaço. A posteriori: mede o tempo de execução propr iamente d i to (empírico) : Arquitetura Linguagem Código Benchmarks Complexidade no Tempo e no Espaço. A priori: feita sem sua execução (teórico): Considera itens de entrada Número de instruções executadas Complexidade no Tempo e no Espaço. Exemplo: Suponhamos que temos dois programas que irão ordenar uma lista de registros de alunos e permitir a busca por alunos na lista ordenada. Como s abe r qua l do s do i s algoritmos é o melhor? Inspirações Complexidade no Tempo e no Espaço. Opções de solução: Em tempo de execução: executando os programas A priori: realizando uma análise prévia dos algoritmos usados Complexidade no Tempo e no Espaço. O projeto e a análise de algoritmos focam na análise a priori. Complexidade no Tempo e no Espaço. Analisar a complexidade computacional de um algoritmo significa prever os recursos de que o mesmo necessitará: Memória Largura da banda de comunicação Hardware Tempo de execução Complexidade no Tempo e no Espaço. Cenários de análise Melhor caso: quase nunca acontece Caso médio: poucas vezes Pior caso: mais frequente Dependência direta do estado da entrada. Ex: ordenação com o vetor já ordenado Complexidade no Tempo e no Espaço. Pergunta: Qual é o problema em medir o tempo de execução de um algoritmo em segundos? Complexidade no Tempo e no Espaço. Pergunta: Qual é o problema em medir o tempo de execução de um algoritmo em segundos? Resposta: O tempo de execução em segundos de um mesmo algoritmo depende de vários fatores, inclusive a máquina onde ele será executado. Complexidade no Tempo e no Espaço. Pergunta: Qual é o problema em medir o tempo de execução de um algoritmo em segundos? Resposta: O tempo de execução em segundos de um mesmo algoritmo depende de vários fatores, inclusive a máquina onde ele será executado. Neste caso, é necessário calcular o número de operações ou passos necessários para a execução de todo o algoritmo Complexidade no Tempo e no Espaço. Ge ra lmen t e p a r a um d a d o problema, haverá mais de um algoritmo para resolvê-lo. Complexidade no Tempo e no Espaço. A aná l i s e de comp l ex i d ade computacional é fundamental no processo de definição de algoritmos mais eficientes para a busca de uma solução. Complexidade no Tempo e no Espaço. Em geral, o tempo de execução e o espaço necessário em memória cresce com o tamanho da entrada. Tempo: quantidade de tempo necessário para um algoritmo finalizar. Espaço: quantidade de memória que um algoritmo precisa. Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. Porque medir a complexidade de algoritmos? O tempo de computação e o espaço na memória são recursos limitados Os computadores podem ser rápidos, mas não são infinitamente rápidos A memória (primária e secundária) pode ser de baixo custo, mas é finita e não é gratuita Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. A taxa de crescimento proporcional de um dado algoritmo em função do tamanho de sua entrada é chamada de complexidade do algoritmo. Complexidade no Tempo e no Espaço. Ela permite uma classificação dos algoritmos segundo sua categoria de complexidade e permite também comparar qualitativamente algoritmos diferentes que realizam a mesma tarefa. Pode ser considerada em termos de tempo de execução (complexidade de tempo) ou termos de espaço de memória utilizado (complexidade de espaço). Complexidade no Tempo e no Espaço. Antes de analisarmos um algoritmo, é necessário termos um modelo da tecnologia de implementação que será usada . Definição de um modelo de recursos da tecnologia e seus custos Complexidade no Tempo e no Espaço. Utilização de um modelo computacional genérico: RAM Utiliza somente um único processador No modelo RAM, as instruções são executadas uma após a outra, sem operações concorrentes ou simultâneas Tipos de dados: inteiros e de ponto flutuante Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. Complexidade no Tempoe no Espaço. Complexidade no Tempo e no Espaço. EXEMPLO Complexidade no Tempo e no Espaço. Complexidade no Tempo e no Espaço. Análise Complexidade Algoritmos SLIDE 3 julioc.silva@pitagoras.com.br Inspirações Análise Assintótica Quais são os problemas existentes nesta solução proposta? Diferentes entradas (instâncias) podem oferecer resultados diferentes para ambos algoritmos Ex: para uma dada entrada E1, A1 foi melhor, mas para a entrada E2, A2 teve um melhor resultado A mesma entrada em um mesmo algoritmo em diferentes máquinas (computadores) pode ter resultados diferentes Ex: para uma dada entrada E1, A1 foi melhor na máquina M1, mas foi pior na máquina M2 Análise Assintótica Análise: estudo de um elemento por partes, decomposição A s s i n t ó t i c a : d e s c r e v e u m comportamento de limite de uma função matemática (mínimos e máximos) Propõe em avaliar limites de uma função matemática em a partir de seus termos. Análise Assintótica O que é Análise Assintótica? Define uma metodologia de análise de algoritmos que tenta resolver estes e vários outros problemas relacionados ao desempenho de algoritmos. Análise Assintótica O que é Análise Assintótica? Permite a análise de desempenho de um algoritmo em função do tamanho da entrada. Não existe o foco em tempo de execução (segundos, etc). Como o algoritmo se comporta (tempo e/ou espaço) quando o tamanho da entrada é aumentado. Análise Assintótica Ordem de crescimento: define o impacto no desempenho quando o tamanho da entrada é alterado Inspirações Inspirações Análise Assintótica Uso de três principais anotações: Notação O Notação Teta (Θ) Notação Omega (Ω) Inspirações Inspirações Inspirações Análise Assintótica A Notação Θ procura por limites inferior e superior (inclusivos) de uma função: melhor e pior casos. É necessário que exista apenas um limite inferior e superior, entretanto, podem existir vários A escolha das constantes depende diretamente da função que está sendo analisada Inspirações Inspirações Inspirações Análise Assintótica Quando a Notação O é usada para expressar custo computacional de um algoritmo no pior caso (tempo ou espaço), está se definindo também o limite (superior) do custo computacional desse algoritmo para todas as entradas. Por exemplo, em função do tempo de execução, o algoritmo de ordenação por inserção é O(n2) no pior caso. Inspirações Inspirações Inspirações Inspirações Inspirações Análise Complexidade Algoritmos SLIDE 4 julioc.silva@pitagoras.com.br Visão Geral Seja A um algoritmo para um problema P. A quantidade de tempo que A consome para processar uma dada instância de P depende da máquina usada para executar A. Mas o efeito da máquina se resume a uma constante multiplicativa: Visão Geral Mas o efeito da máquina se resume a uma constante multiplicativa: Se A consome tempo t numa determinada máquina, consumirá tempo 2t numa máquina duas vezes mais lenta e t/2 numa máquina duas vezes mais rápida. Para eliminar o efeito da máquina, basta discutir o consumo de tempo de A sem as constantes multiplicativas. 6n2+100n+300 Inspirações 0,6n2+1000n+3000 Inspirações Inspirações Inspirações Visão Geral A notação assintótica (Ο - ómicron, Ω - ómega, Θ - teta) é ideal para fazer isso. É preciso introduzir um modo grosseiro de comparar funções. (dependência entre o consumo de tempo de um algoritmo e o tamanho de sua “entrada”). Visão Geral Essa comparação só leva em conta a “velocidade de crescimento” das funções. A s s im , e l a d e s p r e z a f a t o r e s multiplicativos (pois a função 2n2, por exemplo, cresce tão rápido quanto 10n2) e despreza valores pequenos do argumento (a função n2 cresce mais rápido que 100n, embora n2 seja menor que 100n quando n é pequeno). Visão Geral Esse tipo de matemática, interessado somente em valores enormes de n, é chamado assintótica. Nessa matemática, as funções são classificadas em "ordens"; todas as funções de uma mesma ordem são "equivalentes". Visão Geral Inspirações Inspirações Inspirações Inspirações Inspirações Inspirações Inspirações Inspirações Visão Geral Quando dois algoritmos fazem parte da mesma classe de comportamento assintótico, eles são ditos equivalentes. Nesse caso, para escolher um deles deve-se analisar mais cuidadosamente a função de complexidade ou o seu desempenho em sistemas reais.