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