Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura para representação Introdução (cont.) Construção de programas eficientes estruturas de dados eficientes Um algoritmo é uma receita para resolver problemas cujos os passos são concretos e não ambíguos. O algoritmo deve ser correto, de tamanho finito e parar para todos os inputs. Um problema é uma tarefa a ser executada, ou uma pergunta a ser respondida. Um programa é uma “instancialização” de um algoritmo em uma linguagem de programação de computadores. Introdução (cont.) Algoritmo: é um método para resolver um problema. Propriedades: a. deve ser correto b. possui passos concretos c. não possui ambigüidades d. possui número finito de passos e. deve terminar Introdução (cont.) Algoritmo - conceito intuitivo para ajudar pessoas a expressar soluções de problemas Programas - expressar algoritmos numa linguagem formalmente definida Computação Numérica x Computação Comercial “computation intensive” x “data intensive” 3a Geração - Processamento Gráfico • Objetos Geométricos, Figuras • Interface com usuário • CAD - Proc. Imagens - Rec. Padrões Geometria Computac. Introdução (cont.) Especificação da Estrutura de dados X Implementação Especificação concentração em descrever o funcionamento não há preocupação na implementação Análise de algoritmos comportamento do algoritmo (perfil de desempenho) medidas em termos de esforço computacional + espaço Explorar vários tipos de objetos de dados Considerar as classes de operações para cada objeto Representar objeto com suas operações eficientemente Introdução (cont.) Tipo de dado - data type associação do tipo ao nome da variável Tipos built-in com operações - FORTRAN, C possibilidade de criar tipos (C - struct) Domínio - data object - domínio do tipo do dado refere ao conjunto de elementos (Inteiros - {... -2, -1, 0, 1, 2, ...} ) pode ser finito ou infinito Estrutura de Dados - Data Structure conjunto de objetos e como eles são relacionados operações aplicadas aos elementos do objeto ex: objeto INTEGER com operações +, -, *, ÷ Introdução (cont.) •Uma solução é dita ser eficiente se ela resolve o problema dentro das restrições de recursos impostas •O custo de uma solução é a quantidade de recursos que a solução consome. •Muito freqüentemente, o custo é estimado através de um único recurso, como o tempo Introdução (cont.) •Uma estrutura de dados exige uma certa quantidade de espaço para cada item a ser armazenado, uma certa quantidade de tempo para executar uma única operação básica, e um certo esforço de programação •Cada solução para um problema usa as operações básicas em alguma proporção, e a seleção de uma estrutura de dados deve levar isso em conta Modelos de Computação e Medidas de Complexidade Problema como achar um algoritmo eficiente de solução? Se há um algoritmo, como compará-lo com outros? Como julgar se um algoritmo é bom? O que pode ser “computado” ou não por um algoritmo? Modelos de Computação e Medidas de Complexidade (cont.) Especificação de Modelo de Computação Por que? Para executar o algoritmo Não Existe um Modelo que satisfaz todas as situações Palavra com tamanho aleatório Palavra com tamanho finito Para cada problema, deve ser selecionado o Modelo de Computação mais adequado Modelos de Computação e Medidas de Complexidade (cont.) Modelos já sugeridos por •Emil Post •Alan Turing •Alonzo Church Modelos Equivalentes Sistemas de Produção Máquinas de Turing Funções Recursivas RAM - Random Access Memory Modelos de Computação e Medidas de Complexidade (cont.) RAM - Random Access Memory •Capacidade de Memória Ilimitada •Cada célula da Memória com tamanho ilimitado •Unidade aritmética Modelos de Computação e Medidas de Complexidade (cont.) Exemplo de um Algoritmo read r1 if r1 0 then write 0 else { r2 r1 r3 r1 - 1 while r3 > 0 do { r2 r2 * r1 r3 r3 - 1 } write r2 } n n , se n 1 f ( n) 0, caso contrário 3 (n - 1) O(n) Modelos de Computação e Medidas de Complexidade (cont.) Complexidade dá uma idéia de upper bound Por que não um lower bound? O (g) (g) (g) o(g) f O(g) f (g) f (g) f o(g) f cresce no máximo tão rápido quanto g(x) para x f cresce no mínimo tão rápido quanto g(x) para x tem o mesmo crescimento de g(x) para x f cresce mais lentamente que g(x) para x