Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Estruturas de Dados I Introdução Curso de Engenharia de Computação CEFET-MG 2013/2 Cristina Duarte Murta Tópicos da aula Conceitos Algoritmo, Estrutura de dados, Programa Problema Limites da computação Computabilidade Complexidade de algoritmos Introdução à Análise de Complexidade de Algoritmos Algoritmos e Estruturas de dados Algoritmo Seqüência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema Exemplos: receitas médicas, receitas culinárias, procedimentos para montagem de um equipamento Estrutura de dados representação de um conjunto de dados (abstração) Algoritmos + estruturas de dados = programas Nome de um livro do cientista N. Wirth Definições de algoritmo dadas por especialistas Aho, Hopcroft, Ullman algoritmo é uma seqüência finita de instruções, cada uma com um significado claro, que pode ser desempenhada com uma quantidade finita de esforço em um tempo finito Knuth um algoritmo é um conjunto finito de regras que forma uma seqüência de operações para resolver um determinado problema e tem quatro características importantes: finitude: sempre termina após um número finito de passos definição: cada passo é definido precisamente, de forma rigorosa e sem ambigüidade entrada: um algoritmo tem 0 ou mais entradas, tomadas de um conjunto específico de objetos saída: um algoritmo tem uma ou mais saídas Cormen, Leiserson, Rivest seqüência de passos computacionais que transformam uma entrada em uma saída conceito de função matemática Algoritmos e Estruturas de Dados PROBLEMA! Pensando uma solução ALGORITMO ESTRUTURA DE DADOS PROGRAMAPROGRAMA Diferença entre Algoritmo e Problema Problema especificação de uma relação entre uma entrada e uma saída; especifica o que fazer. Algoritmo: solução para um problema um procedimento computacional bem definido que toma a entrada e produz um conjunto de valores como saída; especifica como fazer. Algoritmos são utilizados para resolver problemas. Programas programas são implementações de algoritmos e estrutura de dados programar é projetar a estrutura de dados e construir algoritmos os computadores só entendem programas em linguagem de máquina uma linguagem de programação é uma notação para expressão de programas, com dois objetivos: é um meio para o programador expressar o raciocínio algorítmico compiladores traduzem o algoritmo para a linguagem de máquina ALGORITMO ESTRUTURA DE DADOS PROGRAMAPROGRAMA Algoritmos e Estruturas de dados Algoritmos + estruturas de dados = programas Há interdependência entre os algoritmos e as estruturas de dados Estruturas de dados e algoritmos são partes essenciais de um programa a escolha da estrutura de dados limita ou define os algoritmos associados a elas a escolha dos algoritmos depende de como os dados estão representados, i.é, da estrutura dos dados Formalização do conceito de algoritmo A definição formal de procedimento computacional é feita através de uma formalismo matemático denominado Máquina de Turing (MT) MT: é um modelo de computação abstrato • MT são aceitas como formalização do conceito de algoritmos • há vários formalismos equivalentes Sistemas de Post, algoritmos de Markov, lambda calculus, etc. Tese de Church-Turing • nada será considerado algoritmo se não puder ser apresentado por uma máquina de Turing • todos os problemas que podem ser resolvidos por qualquer modelo de computação podem ser expressos por uma máquina de Turing Todas as formalizações apresentadas até hoje para o conceito de algoritmo foram transcritas para uma MT Máquina de Turing: o computador é uma máquina que processa sequências de bits Computação e Algoritmos • Estudo dos algoritmos e suas implementações – Propriedades matemáticas e formais: estudo do comportamento dos algoritmos para determinar sua correção e eficiência – Implementações em hardware: projeto e construção de sistemas de computação que executam algoritmos => foco importante da Engenharia de Computação – Implementações lingüísticas: projeto de linguagens de programação e algoritmos de tradução destas linguagens de modo que possam ser executadas pelo hardware – Aplicações: identificação de problemas importantes e escrita de software correto e eficiente para resolvê-los Em computação, tudo é algoritmo! Computabilidade e complexidade Áreas de estudo de algoritmos COMPUTABILIDADE se existe uma solução algorítmica para um problema se o problema é computável ou decidível ou recursivo (notação matemática) COMPLEXIDADE qual é a complexidade da solução quão difícil é resolver o problema qual é o custo da solução Computabilidade e complexidade Questões é possível projetar um algoritmo para resolver um problema? é possível projetar um algoritmo eficiente para resolver um problema? é possível afirmar que um determinado algoritmo é o melhor possível para resolver um determinado problema? Computabilidade Dois conjuntos de problemas computáveis: para os quais existe uma solução algorítmica um problema matemático é computável se pode ser resolvido por um computador, isto é, se podemos expressar sua solução na forma algorítmica sinônimos: solucionável, decidível, recursivo não computáveis: problemas que não podem ser resolvidos algoritmicamente Indecidíveis: problemas de decisão A teoria da computabilidade prova que há inúmeros problemas não computáveis (indecidíveis) A teoria não ajuda a especificar quais são estes problemas Computabilidade Um problema indecidível – não computável Problema da parada (the halting problem) Entrada: um programa P e uma entrada de dados w Saída: decidir se o programa P será finalizado para a entrada w P pode entrar em loop infinito e nunca parar! O problema da parada é indecidível Não é possível escrever um algoritmo que resolve o problema da parada Algoritmo para o problema da parada Entradas: P,w Saída: sim/não Computabilidade Um problema indecidível – não computável Problema da parada (the halting problem) Entrada: um programa P e uma entrada de dados w Saída: decidir se o programa P será finalizado para a entrada w P pode entrar em loop infinito e nunca parar! O problema da parada é indecidível Não é possível escrever um algoritmo que resolve o problema da parada Algoritmo para o problema da parada Entradas: P,w Saída: sim/não Áreas de estudo dos algoritmos • Computabilidade trata da existência ou não de algoritmos para resolver determinados problemas • Teoria de algoritmos trata da existência ou não de algoritmos eficientes para resolver determinados problemas • Projeto de algoritmos trata do estudo das técnicas de projeto que geralmente produzem algoritmos efetivos para classes de problemas • Análise de algoritmos – análise de complexidade dado um algoritmo, determinar suas características de desempenho, isto é, determinar seu comportamento frente às entradas possíveis Algoritmos na prática um algoritmo útil deve requerer não apenas um número finito de passos, mas um número finito e razoavelmente pequeno de passos. Há algoritmos que podem demorar milênios para serem executados veremos a seguir... Características desejáveis nos algoritmos correção o algoritmo para com a saída correta para qualquer instância válida da entrada prova de correção: verificação formal eficiência o algoritmo deve fazer uso eficiente dos recursoscomputacionais elegância código correto, eficiente, simples, claro, fácil de implementar robustez provê respostas para qualquer entrada de dados generalidade adaptabilidade do algoritmo a diversos tipos de dados e sistemas Complexidade computacional Para os problemas computáveis Precisamos conhecer sua complexidade Quanto custa uma determinada solução? Qual é a melhor solução possível? Qualquer solução inclui obrigatoriamente o custo inerente ao problema Complexidade de algoritmos Recursos gastos para resolver um problema computacional Todo tipo de recurso Principais: tempo de CPU e espaço em memória Análise de Complexidade de Algoritmos Análise de complexidade parte da computação que avalia a eficiência (o custo) dos algoritmos em termos de tempo de execução - uso de CPU espaço ocupado - uso de memória estuda o comportamento dos algoritmos frente às entradas que ele pode receber o custo dos algoritmos depende do tamanho da entrada de dados Análise de Complexidade de Algoritmos Porque é importante para auxiliar o projeto e a implementação dos programas para melhorar a eficiência dos programas programas com entradas de dados muito grandes programas executados milhares ou milhões de vezes para avaliar o tempo de execução dos algoritmos para comparar diversos algoritmos que resolvem o mesmo problema porque nos diz qual é o maior problema que pode ser resolvido por um ou mais computadores! Análise de Complexidade de Algoritmos Três perspectivas da análise de complexidade: • Análise de um algoritmo particular – Quanto custa a execução de um dado algoritmo? • Análise de uma classe de algoritmos – Dada uma coleção de algoritmos que resolvem um mesmo problema, qual é o melhor algoritmo do conjunto? • Análise de um problema – Qual é o menor custo possível para resolver um dado problema? – Quais são os limites mínimos de tempo e espaço necessários para resolver um problema computável? O custo inerente ao problema... Análise de complexidade de algoritmos Quanto a tempo de execução uso de CPU: medida do número de operações que um programa executa espaço ocupado uso de memória: medida do espaço ocupado durante a execução do programa Custos de tempo e de espaço são dados em função do tamanho da entrada complexidade de tempo e de espaço Análise do espaço ocupado: como fazer Cálculo da quantidade de dados que um algoritmo deve armazenar na memória do computador para fazer sua tarefa mais os dados iniciais Como fazer: avaliar a quantidade de variáveis e o espaço ocupado por elas Dois casos básicos uso eficiente do espaço o algoritmo utiliza o espaço correspondente aos dados de entrada mais uma fração deste valor uso pouco eficiente do espaço o algoritmo utiliza o espaço correspondente aos dados de entrada mais uma quantidade igual ou maior do que este valor Análise do tempo de execução Há duas maneiras de avaliar o tempo de execução 1- Medição empírica ou experimental – medir o tempo de execução do algoritmo para diversas entradas – este tempo é influenciado por diversos fatores • ambiente: hardware, sistema operacional, compiladores • condições de processamento no momento da execução • o algoritmo • a entrada de dados – esta medida é válida em situações particulares • vantagem: dá a medida de tempo real de uma execução • desvantagem: esta medida só é válida para o ambiente em que foi executada Análise do tempo de execução Duas maneiras de avaliar o tempo de execução (continuação) 2 - Análise ou medida analítica determina a quantidade de trabalho requerida pelo algoritmo, que depende da natureza do problema do algoritmo utilizado para sua solução da entrada de dados (tamanho e formato) o custo é determinado por uma expressão matemática que representa a ordem da grandeza de tempo de execução esta expressão representa ou “traduz” o comportamento do algoritmo quanto ao seu tempo de execução Funções de complexidade Medida analítica do tempo de execução Como analisar a complexidade de tempo de um algoritmo um algoritmo é uma seqüência de operações ou passos ou comandos dos tipos instruções básicas: comandos de atribuição, operações matemáticas e lógicas, comandos de leitura e escrita, trocas, etc. comandos condicionais (comandos de decisão, testes) iterações ou loops ou laços chamadas de função/método/procedimento/rotina/subrotina combinação das anteriores Medida analítica do tempo de execução Medida analítica Princípio: o custo do algoritmo é dado pelo número de operações executado pelo algoritmo o tempo de execução é proporcional ao custo calculado Consiste em contar o número de operações ou passos ou comandos que um algoritmo executa para uma dada entrada de dados Este resultado é apresentado como uma função matemática com parâmetro n (tamanho da entrada) => o custo é uma função do tamanho da entrada n Medida analítica do tempo de execução Exemplo: contar o número de instruções executadas no seguinte comando: for (i = 1; i <= n; i++) a[i] = 0; Medida analítica do tempo de execução Exemplo: contar o número de instruções executadas no seguinte comando: for (i = 1; i <= n; i++) a[i] = 0; Operações e número de execuções • Atribuição i = 1 1 execução • Atribuição a[i] = 0 n execuções • Incremento i = i + 1 n execuções • Teste i <= n ? n + 1 execuções TOTAL 3n +2 comandos executados Medida analítica do tempo de execução Exemplo: contar o número de instruções executadas no seguinte comando: for (i = 1; i <= n; i++) a[i] = 0; f(n): função que expressa o custo da linha acima de acordo com o tamanho da entrada n f(n) = 3n + 2 f(n) cresce proporcionalmente a n Medida analítica do tempo de execução Como analisar um algoritmo particular contar o número de operações realizadas pelo algoritmo para uma dada entrada expressar este número em função do tamanho da entrada exemplos: f(n) = 5n g(n) = 2n2 + 10 h(n) = nlogn como calcular o tempo (aproximação) medir o tempo médio para uma operação multiplicar o tempo pela função de complexidade Como calcular o tempo considere um computador de 1 GHz suponha que este computador execute 109 operações por segundo (aproximação) custo médio de uma operação: 1 ns para um algoritmo com f(n) = n e n= 109 o computador gastará 1 segundo para um algoritmo com f(n) = 100 n e n= 109 o computador gastará 100 s • para um algoritmo com f(n) = n2 e n= 109 – o computador gastará 31,7 anos Medida analítica: premissas a análise é sempre realizada em relação a um modelo computacional: computador genérico com um processador máquina RAM (Random Access Memory) todos os acessos à memória tem o mesmo custo instruções são executadas sequencialmente (uma após a outra) não há instruções nem operações paralelas todas as instruções simples têm custo similar (uma unidade de tempo) +,-,*,/, =, ==, >, <, if, etc. chamadas de função e laços não são operações simples são composições de operações simples algoritmos com operações mais caras também podem ser analisados sem perda de precisão por exemplo, algoritmos que incluem operações matemáticas complexas ou acesso à memória secundária Análise de Complexidade de Algoritmos Algoritmo ótimo é o algoritmo cujo custode execução é igual ao custo mínimo para a classe de problemas que ele resolve. Exemplo: Problema P de tamanho n com custo mínimo f(n) = 50n 3 algoritmos A, B e C que resolvem o problema P com custos de, respectivamente, 2n2, 50n e nlogn B é um algoritmo ótimo. Análise de complexidade Ordem de crescimento e constantes as funções de complexidade são descritas por funções matemáticas exemplos 2n, 3n + 2, 2n2 , 3 log n , 5 n log n , 19n3 + 100, 2n + 32, etc. informação mais importante para análise da complexidade é a ordem de crescimento => classe de complexidade se a função é logarítmica, linear, quadrática, cúbica, exponencial, etc. para obter a classe de complexidade, constantes aditivas e multiplicativas são desprezadas constantes são importantes somente se são muito grandes para comparação mais refinada (detalhada) da eficiência Ordens de Grandeza e seus prefixos padrão internacional – obrigatório saber Sistema internacional de unidades SI Bibliografia Projeto de Algoritmos Nivio Ziviani Edições em Pascal/C, Java/C++ Algoritmos: Teoria e Prática T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein tradução da 2a. edição americana Editora Campus, 2002. Avaliação 2 provas de 40 pontos cada Prova 1 em dezembro: dia 17 ou 19 Prova 2 data a ser definida Várias listas de exercícios = 20 pontos Exercício 1 Individual Fazer um resumo de EXATAMENTE uma página do Capítulo 1 do livro do Ziviani. Papel a4, espaço 1, 50 linhas Resumos iguais terão notas iguais a zero. Para o dia 14 de novembro Computabilidade Slide 2 Slide 3 Definições dos Cientistas da Computação Slide 5 Diferença entre Algoritmo e Problema Slide 7 Slide 8 Formalização do conceito de algoritmo Slide 10 Ciência da Computação e Algoritmos Definição de ciência da computação (Gibbs e Tucker) Computabilidade e complexidade Slide 13 Slide 14 Slide 15 Slide 16 Áreas de estudo dos algoritmos Algoritmos na prática Características desejáveis nos algoritmos Complexidade Análise de Complexidade de Algoritmos Slide 22 Slide 23 Análise de complexidade de algoritmos Análise do espaço ocupado Análise do tempo de execução Slide 27 Funções de complexidade Medida analítica do tempo de execução Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Como calcular o tempo Medida analítica: premissas Slide 37 Análise de complexidade Ordens de Grandeza e seus prefixos Slide 40 Slide 41 Slide 42
Compartilhar