Estrutura de Dados e Algoritmos em C

Propaganda
Estrutura de Dados
e Algoritmos em C
Roberto de Beauclair Seixas
[email protected]
Porque usar computador ?
“É indigno de homens eminentes perder
horas como escravos na tarefa desgastante
de calcular. Esse trabalho bem poderia ser
confiado a pessoas sem qualquer
qualificação especial, se máquinas
pudessem ser utilizadas.”
Gottfried Wilhelm Leibniz
2
Engenharia de Software
“Engenharia de software é a área
interdisciplinar que engloba vertentes
tecnológicas e gerencial visando a
abordar, de modo sistemático, os
processos de construção, implantação e
manutenção de produtos de software com
qualidade assegurada por construção,
segundo cronogramas e custos
previamente definidos.”
3
Engenharia de Software
Interdisciplinar baseada nos seguintes áreas:
Ciência da Computação
Sistemas e Modelos
Avaliação de Complexidade de Problemas
Álgebra Linear
Cálculo
Administração de Projetos
Comunicação
4
Estrutura de Dados
Em linguagens de programação o Tipo de Dado de uma
variável define o conjunto de valores que a variável pode
assumir.
Tipo Abstrato de Dados é o Tipo de Dado em termos
do que os usuários podem fazer e não ao computador.
Estrutura de Dados é um método particular de se
implementar um Tipo Abstrato de Dados.
A implementação de um Tipo Abstrato de Dados
escolhe uma Estrutura de Dados para representá-lo.
Cada Estrutura de Dados é construída dos tipos básicos
(int, real, char) ou dos tipos estruturados (array, record)
de uma linguagem de programação.
5
Abu Abd-Allah ibn Musa
al'Khwarizmi
Seu trabalho mais importante escrito
em 830 nos dá a palavra álgebra.
classifica a solução de equações quadráticas
e dá métodos geométricos para completar o quadrado.
Al'Khwarizmi também escreveu números Hindu-árabe.
Este texto de árabe está perdido mas uma tradução latina
“Algoritmi de numero Indorum”, em inglês “Al-Khwarizmi on the
Hindu Art of Reckoning”, deu origem a palavra algoritmo que
deriva do nome dele no título.
O primeiro uso do zero com lugar posicional na anotação
básica provavelmente foi devida a al'Khwarizmi.
6
Algoritmo
Dicionário Webster:
“Any special method of solving a certain kind of problem.”
7
Algoritmo
Dicionário Webster:
“Any special method of solving a certain kind of problem.”
( parece coisa do McGuiver! )
8
Algoritmo
Fundamentals of Computer Algorithms;
E.Horowitz, S.Sahni; 1978:
“A precise method useable by a computer for the
solution of a problem.”
9
Algoritmo
Fundamentals of Computer Algorithms;
E.Horowitz, S.Sahni; 1978:
“A precise method useable by a computer for the
solution of a problem.”
10
Linguagem C
Desenvolvida pelo Bell Lab no início dos anos 70,
visando a implementação do UNIX. Possui um
padrão feito por Kernighan e Ritchie em 1978.
Tem facilidades para a programação em “alto” e
“baixo” níveis e gera código eficiente.
Possui um grande conjunto de operadores, o que
permite um código compacto, porém de baixa
legibilidade.
É excelente para construir programas portáveis.
11
Oops!
#include <stdio.h>
main(){char *b=" .:-;!/>)|&IH%*#"; float
i,j,k,r,x,y=-16; while (puts(""),y++<15)
for(x=0;x++<84; putchar(b[(int)k&15]))
for(i=k=r=0; j=r*r-i*i-2+x/25, i=2*r*i+y/10,
j*j+i*i<11&&k++<111; r=j);}
12
Motivação:
Presente
Engenharia de Software:
What the Hell is this?
Engenheiros Civis fazem Plantas antes de
construírem prédios;
Engenheiros Eletrônicos fazem Esquemas antes
de montarem aparelhos;
Engenheiros Mecânicos fazem Desenhos antes
de produzirem máquinas;
Engenheiros de Software são superdotados pela
Mãe Natureza, e não precisam de nada disso!
“Se prédios fossem construídos da mesma forma que fazemos
sistemas, o primeiro pica-pau que aparecesse no planeta destruiria
a humanidade” - Weinberg
14
A Engenharia de Software é
uma área MUITO NOVA!
O ser humano faz casas e abrigos há
milhões de anos;
O ser humano lida com eletricidade há
milhares de anos;
O ser humano produz máquinas e
ferramentas há outros milhares de anos;
O ser humano faz software há 40 anos.
Estamos nos primórdios da computação...
15
Conclusão
“A formulação de um problema é
freqüentemente mais essencial do que sua
solução, a qual pode ser meramente uma
questão de habilidade matemática ou
experimental.”
Einstein e Infeld,
“A Evolução da Física” - 1938
16
Aderência da Linguagem
17
Motivação:
Passado e Futuro(?)
Alan M. Turing
(1912-1954)
Computing Machinery and Intelligence.
Mind, Vol. LIX. 433-460, 1950.
Os computadores terão inteligência.
Debate: Então, e agora ?
Será uma relação simbiótica ?
(computador como uma ferramenta)
Os computadores terão “consciência”?
19
53 anos depois
Previsão de tecnologia de Turing foi fantástica!
Armazenamento de Gb de memória são comuns.
Previsão de inteligência foi otimista.
Vários locais da Internet oferecem “chatterbots” do Teste de Turing.
Ninguém passou (ainda)
` http://www.loebner.net/Prizef/loebner-prize.html
Os testes de Turing ainda se apresentam como desafios de
longo prazo.
Mas acredita-se que não demorará
menos de 50 anos, mais de 10 anos.
20
Mas, houve progresso ...
Computadores solucionaram alguns problemas:
“Mapa de 4 cores”
K. Appel and W. Haken, “The solution of the four-color-map problem,”
Scientific American, Oct 1977, 108-121
e uma prova “manual” http://www.math.gatech.edu/~thomas/FC/fourcolor.html
(1995)
Os computadores venceram o campeão mundial de xadrez
com alguma ajuda dos programadores, mas … venceu!
Os computadores estão presentes no dia-a-dia
Ajudam a projetar e idealizar novas coisas
Estas são relações simbióticas.
Aprendizado e formação de conhecimento ainda são ilusórios.
21
Armadilha dos números
Os seres humanos possuem 100 Tb de informação (1012) e podem
processar 100 T ops.
ROBOT, Hans Moravec, Oxford, 1998, page 58
Então, um supercomputador “tem” um poder comparável.
O Genoma humano tem 109 bits:
90% não possuem informação alguma (proteínas de ligação)
90% em comum com os chimpanzés
90% comum entre os indivíduos
Então, realmente só 106 bytes são relevantes (huh?!)
Estamos perdendo algo ...
Um excelente algoritmo de compressão ?
Uma melhor linguagem de programação ?
Técnicas de aprendizado ?
22
Charles Babbage
(1791-1871)
Os objetivo de Babbage foram
alcançados
mas ainda precisamos de melhores algoritmos e máquinas
mais rápidas.
O que acontecerá quando:
A capacidade de processamento for infinita ?
A capacidade de armazenamento for infinita ?
Limites remanescentes:
Conteúdo: A capacidade de informação do Cyberspace
Software: Bugs, >100$ por linha de código (!)
Processamento: > 1,000 $/cpu/ano
23
Benefícios
Hoje os computadores podem:
Ler para os cegos (OCR & Texto → Fala)
Ouvir para os surdos (Fala → Texto)
Escrever para os deficientes (Fala → Texto)
Logo:
Substituir deficiências:
` melhor memória, melhor visão, …
Novas formas de comunicação
` Tradução automática de telefonemas
Revolucionar a interface homem-computador
24
Vannevar Bush
(1890-1974)
“As We May Think” The Atlantic Monthly, 1945
http://www.theatlantic.com/unbound/flashbks/computer/bushf.htm
Memex
Todo conhecimento humano
… “a billion books” hyper-linked together ...
Registrando tudo o que se vê
` filmes e fotos
` ... “a machine which types when talked to” ...
Navigate by
` … text search following links associations ...
Conexões diretas ao sistema nervoso ?
25
Memex Individual
Memex: “Lembrar o que é visto e ouvido e rapidamente
devolver qualquer informação solicitada”
26
Quanto de Informação Existe
?
Logo, tudo poderá ser gravado e
catalogado.
A maioria da informação nunca será
vista.
Fundamentos tecnológicos:
Atenção humana
“Sumarização” automática
Busca automática
http://www.lesk.com/mlesk/ksg97/ksg.html
27
Resumo
Pense seriamente sobre Algoritmos
Qual o melhor algoritmo para um problema?
→ “aderência”
Oito paradigmas para projetar um bom algoritmo:
1. reduzir a um problema conhecido (ex: ordenação);
2. recursão;
3. criar ou expandir uma estrutura de dados;
4. dividir e conquistar;
5. guloso;
6. programação dinâmica;
7. probabilidade;
8. aproximação.
28
Cuidado com os efeitos
colaterais!
29
Estruturas de Dados
e Algoritmos em C
Proposta de Curso – Nível Iniciação Científica
A finalidade deste curso é ensinar ao aluno as técnicas básicas
de estruturação de dados em linguagens convencionais e
capacitá-lo a empregar essas técnicas, na construção de
pequenos programas.
Descrição do Curso
Familiarizar os alunos com a linguagem de programação C,
enfocando os elementos essenciais para a construção de
programas confiáveis, seguros, corretos, eficientes e baratos.
Para tanto, as estruturas de dados básicas serão estudadas e
implementadas em C, bem como algoritmos para manipulá-las.
30
Ementa
Linguagem C
Conceitos fundamentais
Expressões
Controle de fluxo
Funções
Estruturas de dados básicas
Vetores
Matrizes
Cadeia de caracteres
Tipos estruturados
Ordenação e busca
Arquivos
Ordenação
Busca
Hashing
Aplicações
Grafos e árvores
Buscas
Árvore geradora mínima
Caminho mínimo
Redes de fluxo
Estruturas de dados dinâmicas
Alocação dinâmica
Listas encadeadas
Pilhas
Filas
Árvores
31
Problema Algorítmico
Problema
E ⇒ conjunto das possíveis entradas
S ⇒ conjunto das saídas desejadas
R(E,S) ⇒ relação entre entradas e saídas desejadas
O ⇒ operações válidas
Solução
A ⇒ algoritmo correto
e
∀e ∈ E
A
s
(e,s) ∈ R(E,S)
32
Solução de Problemas
modelo
modelomatemático
matemático
algoritmo
algoritmoinformal
informal
tipo
tipoabstrato
abstratode
dedados
dados
pseudo
pseudocódigo
código
estrutura
estruturade
dedados
dados
programa
programa
...
código
códigode
demáquina
máquina
33
Algoritmos e
Complexidade
Problema, Instância e Algoritmo.
Dado um problema:
Como encontrar um algoritmo eficiente para
solucioná-lo ?
Uma vez encontrado, como compará-lo a outros
algoritmos que também resolvem o problema ?
Como determinar se o algoritmo está correto ?
Como determinar se o algoritmo é eficiente ?
34
Algoritmo
Conjunto finito de instruções, composta de uma ou
mais operações válidas, com o objetivo de
resolver um problema específico.
Operações válidas
definidas
efetivas
5÷0
√π
Término em tempo finito (procedimento computacional)
Entrada (opcional)
Saída (uma ou mais)
35
Alguns Exemplos Iniciais
Para qualquer algoritmo, temos que provar que ele sempre
retornará o resultado desejado para todas as instâncias
possíveis do problema.
⌦
⌦
Correção (Correctness)
Eficiência
36
Critérios de Análise
especificação
Eficácia
Correção
problema
algoritmo
requisitos
verificação
NÃO
erros
código
Eficiência
Tempo
Espaço
Simplicidade / Clareza
Otimalidade
Limitações
Computabilidade
Tratabilidade
SIM
solução
Parcialmente Correto
entrada válida → saída
desejada
pode ser tempo infinito
Totalmente Correto
tempo finito
saída desejada
37
Correção não é óbvio!
⌦
⌦
⌦
Você recebeu a tarefa de programa um braço de robô de
soldagem.
O robô deve soldar (visitar) o primeiro ponto de solda,
depois o segundo, terceiro e assim por diante.
Determine um algoritmo para achar o melhor caminho.
38
Vizinho Mais Próximo
⌦
Inicie em algum ponto p0 e então vá para o ponto mais
próximo p1. Repita o processo a partir de p1, etc. até que
todos os pontos sejam visitados.
Escolha e visite um ponto inicial p0
p = p0;
i = 0;
enquanto existirem pontos não visitados
i=i+1
escolha e visite o ponto pi, mais próximo de pi-1
retorne ao ponto inicial
⌦
Este algoritmo é simples de entender, simples de
entender e muito eficiente. Está correto ?
39
Vizinho Mais Próximo
⌦ Algoritmo
não é correto!
⌦ Escolher
sempre o ponto mais próximo é muito
restritivo, pois pode nos levar a fazer movimentos
desnecessários.
40
Par Mais Próximo
⌦
Conectar ao par mais próximo de pontos cuja conexão
não irá causar um ciclo ou bifurcações, até se formar
uma única cadeia de pontos com todos os pontos.
faça n ser o número de pontos do conjunto e d = ∞
para i = 1 até n - 1 faça
para cada par de pontos (x,y) de caminhos parciais
if (dist(x,y) <= d) então
xm = x; ym = y; d = dist(x,y);
conecte (xm, ym) por uma aresta
conecte os dois pontos por uma aresta
⌦
Este algoritmo está correto para o contra-exemplo
anterior. Então agora estará correto ?
41
Par Mais Próximo
⌦ Algoritmo
⌦ Existe
não é correto!
algoritmo correto ?!
42
Um algoritmo correto
Podemos tentar todas as ordenações de pontos
possíveis e então selecionar a ordenação que
minimiza o comprimento total.
Uma vez que todas as possíveis ordenações são
consideradas, podemos garantir que teremos o melhor
caminho possível.
Mas, isso significa testar n! permutações, que é
extremamente lento. Tão lento que é inviável quanto
se tem mais de 10 ou 20 pontos.
Conclusão: Não existe um algoritmo correto eficiente!
Traveling Salesman Problem 43
Eficiência
“Porque (simplesmente) não usar um supercomputador?”
Supercomputadores são para pessoas muito ricas e
muito estúpidas para escrever algoritmos eficientes!
(S.Skiena)
Um algoritmo rápido rodando em um computador lento
irá sempre ganhar de um supercomputador com um
algoritmo ruim para instâncias suficientemente grandes.
Normalmente, os problemas não chegam a ficar tão
grandes antes do algoritmo rápido ganhar.
44
Problema: Ponto em Polígono
Dado em polígono plano simples, ou seja, os
lados não se cruzam, P e um ponto p do
plano, decidir se p é interior ou não ao
polígono P.
•p
P
45
Complexidade Assintótica
Existe algum algoritmo que resolve o problema?
Isso requer que o algoritmo pare após um número finito de
passos para qualquer instância do problema.
Dado um certo algoritmo A, quão eficiente é este
algoritmo? Dado dois algoritmos A e B, qual deles é
superior?
Dentre todos os algoritmos que resolvem o problema, qual
deles é melhor?
Medir a complexidade (ou eficiência) de um algoritmo pelo
tempo necessário à sua execução em função do tamanho
da instância. (Complexidade Assintótica O(f (n)))
46
Análise de Algoritmos
Recursos Computacionais
Tempo de execução e quantidade de memória
Implementação do Algoritmo
Linguagem e arquitetura
Tamanho da entrada (N)
Número de elementos ou número de nós da expressão
Complexidade (tempo) de Pior Caso
T(N): Maior tempo de execução do algoritmo com todos os
problemas possíveis de tamanho N.
T(N) é proporcional ao número total de instruções t (N)
executadas para o pior caso de tamanho N ⇒ T(N) = c t (N)
47
Definição 1
Um algoritmo A para resolver P tem
complexidade O(f (n)) se existe uma
constante k > 0 e um natural N tais que,
para qualquer instância de P de tamanho n
> N, o número de passos de A necessários
para resolver esta instância é, no máximo, k
f (n).
ex. 1000 n2 “ambiente computacional”` “natureza do método”
48
Ordens de Magnitude
x←x+y
for i ← 1 to n
for i ← 1 to n
begin
begin
x←x+y
end
for j ← 1 to n
begin
x←x+y
end
end
1
n
n2
49
Complexidade
Se um algoritmo processa problemas de tamanho
n em tempo cn2 para alguma constante c, então
dizemos que a complexidade (time complexity) do
algoritmo é O(n2), lendo-se “ordem n2”.
algoritmo
A1
A2
A3
A4
A5
complexidade
n
n log n
n2
n3
2n
1s
1000
140
31
10
9
1m
1h
6x104 3.6x106
4893 2.0x105
244
1897
39
153
15
21
50
Tempo de Execução
Tamanho
Complexidade
20
50
100
200
500
1000
1000 n
0.02 s
0.05 s
0.1 s
0.2 s
0.5 s
1s
1000 n log n
0.09 s
0.3 s
0.6 s
1.5 s
4.5 s
10 s
100 n 2
0.04 s
0.25 s
1s
4s
25 s
2m
10 n 3
0.02 s
1s
10 s
1m
21 n
2.7 h
n log n
0.4 s
1.1 h
220 d
125 s
5E8 s
2n
1s
35 a
3E4 s
-
Obs.: Supondo que 1 operação leva 1 µs.
51
Curiosidades
Explosão Combinatorial
100! → número com 158 dígitos
120! → número com 200 dígitos
número de prótons no universo → 126 dígitos
número de µ segundos desde o Big-Bang → 24 dígitos
Impacto da Evolução Tecnológica
algoritmo
n
n2
n3
2n
atuais
N1
N2
N3
N4
100 x
100 N1
10 N2
4.64 N3
N4 + 6.64
1000 x
1000 N1
31.6 N2
10 N3
N4 + 9.97
52
Outra Curiosidade (sic!)
Dada a função f abaixo, calcule o seu valor
para x = 40545 e y = 70226.
f (x,y) = 9 x4 - y4 + 2 y2
dígitos: 3
7
11 15
19 21
1010 -10-13 1.3 107 82152 2
Oops! O valor correto é 1
53
Outra Curiosidade (sic!)
Dada a função f abaixo, calcule o seu valor para:
x = 77617
y = 33096.
f (x,y) = 333.75 y6 + x2 (11 x2 y2 - y6 - 121 y4 - 2) + 5.5 y8 + x/2y
Precisão simples:
Precisão dupla:
Precisão extendida:
1.172603…
1.1726039400531…
1.172603940053178…
Oops! O valor correto é
-0.8273960599…
( - 54767 / 66192 )
54
Moral da História
“Computers do not solve problems,
People do!”
E.R.Davidson
55
Download