E
STRUTURAS DED
ADOS EA
LGORITMOSA
PRESENTAÇÃO DOC
URSO EI
NTRODUÇÃOAdalberto Cajueiro (adalberto@computacao.ufcg.edu.br) Departamento de Sistemas e Computação
Universidade Federal de Campina Grande
1
A
PRESENTAÇÃO DO CURSOCréditos: 4
Carga-horária: 60h
Pré-requisitos: Programação II, Laboratório de Programação II, Teoria dos Grafos
Dependências: OAC, LOAC, PLP, ATAL
Linhas gerais: estudo preliminar sobre
algoritmos e avançado sobre estruturas de dados.
Página do professor:
A
PRESENTAÇÃO DO CURSOPágina do curso de EDA:
https://sites.google.com/a/computacao.ufcg.edu.br/ edaufcg
Página do curso de LEDA:
https://sites.google.com/a/computacao.ufcg.edu.br/ ledaufcg/
Para cada disciplina existe um grupo associado (acessível através da página da disciplina)
Solicitem para serem adicionados nos grupos URGENTE!
3
D
ICAS PARA AD
ISCIPLINA(EDA)
Acompanhar os avisos no grupo da disciplina e acompanhar o site da disciplina constantemente.
Não deixar o assunto acumular.
Fazer os exercícios recomendados.
Estudar também pelas referências.
Fazer uso da monitoria (aulas e horários de atendimento aos alunos).
Revisar a matemática necessária.
Evitar fazer reposições.
D
ICAS PARA AD
ISCIPLINA(LEDA)
Acompanhar os avisos no grupo da disciplina e acompanhar o site da disciplina constantemente.
Não deixar o assunto acumular.
Fazer os exercícios recomendados.
Estudar também pelas referências.
Fazer uso da monitoria (aulas e horários de atendimento aos alunos).
Revisar a matemática necessária.
Evitar fazer reposições.
Conversar com a turma anterior.
Crie suas implementações! Não as pegue pronta
com o alguem do semestre anterior. 5
A
VALIAÇÃO(
INFORMAÇÃO NOSITE)
EDA
3 provas teóricas
LEDA
3 provas práticas
16 roteiros
Bonificação na média (critérios a definir)
I
NICIANDO A CONVERSA…
O que é um algoritmo?
Como podemos descrever algoritmos?
Como devemos avaliar algoritmos?
O que é análise de algoritmos?
7
O
QUE É UM ALGORITMO?
Procedimento que recebe valores a serem
manipulados (entradas) e produz algum valor (ou valores) como saída.
E
XEMPLOS DEA
LGORITMOSReceita de bolo
Descrição de como trocar o pneu de um carro
Algoritmo para resolver equações quadráticas
Algoritmo para calcular o MDC, MMC, raiz quadrada
Métodos ensinados a crianças para somar, subtrair, multiplicar e dividir inteiros
…
9
P
ROGRAMAS XA
LGORITMOSAlgoritmo
Idéia usada para computar alguma coisa
Expresso em diversas linguagens naturais
Programa
Texto que descreve um sistema computacional
E
SCRITA DEA
LGORITMOSLinguagem natural?
Linguagem de Programação (código) ?
Pseudo-código?
Linguagem
Humana Código
pseudo-código
11
E
XEMPLOE
XEMPLOdouble[] calculaMedia(int[] v){ 1: for i = 1..n
2: soma = 0
3: for j = 1..i
4: soma = soma + V[j] 5: M[i] = soma/i
6: return M }
Como avaliar o algoritmo?
13
C
RITÉRIOS DE AVALIAÇÃOCorretude
Se para toda entrada especficada a saída correta é produzida
Simplicidade
Facilmente entendido, implementado e mantido
Eficiência
D
E VOLTA AOE
XEMPLOdouble [1..n] calculaMedia(int V[1..n]){ 1: for i = 1..n
2: soma = 0
3: for j = 1..i
4: soma = soma + V[j] 5: M[i] = soma/i
6: return M }
É correto? É simples? É eficiente?
15
C
ORRETUDEGarantir que em qualquer possível execução, cada bloco faz exatamente o que esperamos que faça
Ações relacionadas a corretude:
Identificar o que deve ser feito por cada bloco
Identificar o estado antes do bloco executar
Avaliar o efeito do bloco sobre o estado
Caracterizar o estado após a execucao do bloco
S
IMPLICIDADEVoce teria dificuldade em implementá-lo?
Voce teria dificuldades em encontrar erros em uma implementação de outra pessoa?
17
E
FICIÊNCIANão basta dizer apenas se é eficiente mas quão eficiente!
Como algoritmo é idéia, como avaliar os recursos que uma idéia consome?
Abstrair detalhes de implementação.
Refletir apenas o que é intrinseco de cada algoritmo.
E
FICIÊNCIAA eficiência de um algoritmo é relevante?
19
E
FICIÊNCIAPor que estudar eficiência?
Os algoritmos ajudam a estudar a escalabilidade A eficiência geralmente descreve a linha entre:
Tratável, intratável, insolúvel
É a “moeda” da computação
Qual é o melhor algoritmo para a solução de um problema?
E
FICIÊNCIAMétodo experimental
várias implementações completas
um grande número de execuções controladas
medição cautelosa das variáveis de interesse
análise (estatística) dos resultados
Método analítico
idéia: construir um modelo matemático do algoritmo.
comparar algoritmos com base nos modelos
21
A
BORDAGEME
XPERIMENTALExecutar os dois algoritmos
Medir o tempo
public static int arrayMax(int[] A) { .. }
long antes =
System.
nanoTime
()
;
int x =
arrayMax
(new int [] {4,5,6,1});
long depois =
System.
nanoTime
();
A
BORDAGEME
XPERIMENTAL1 1 1 1 1
11111111 t (ms)
n
Algoritmo
Tamanho da entrada +- 50
medições
23
A
BORDAGEME
XPERIMENTALFatores que influenciam
Tamanho da entrada (n)
Hardware
Processador
Memória
Software
Sistema Operacional Linguagem de Programação
Compilador
C/C++
25
A
BORDAGEME
XPERIMENTALLimitações:
Os experimentos são realizados em um número limitado de testes.
Os dados podem não indicar a tendência dos valores não
testados
Os dois algoritmos devem ser testados no mesmo ambiente (hardware e software)
Para analisar o tempo de execução, precisamos
Qual o desafio
para comparar
algoritmos sem
executa-los?
27Propor uma
metodologia
O
BJETIVOSConsiderar todas as entradas
Abstrair detalhes: analisar algoritmos independentemente de hardware e software
Análise feita em alto nível (pseudo-código)
Avaliar sem precisar rodar experimentos
29
public boolean XYZ(int n, …) { …
… }
f(n)
Algoritmos
Matemática Análises
C
ONSIDERAÇÕESO tempo de execução de cada operação primitiva depende do hardware e software, mas de todo modo é constante
Hipótese
O
PERAÇÕESP
RIMITIVASAtribuição: a = x
Operação aritmética: a+1
Comparação de números: a>b
Indexar array: a[i]
Retorno de método: return x;
Custo unitário: custo(primitiva) = 1
31
Custo constante: custo(primitiva) = c
ouC
USTO DASO
PERAÇÕESInstruções Consecutivas
If then else
Cmd1;
Cmd2; custo(Cmd1) + custo(Cmd2)
if (teste) { ... // CustoIf } else {
... // CustoElse }
custo(teste) +
C
USTO DE OUTRASO
PERAÇÕESLaço
Aninhamento de Laços
tempo do laço interno x tempo do laço externo
Recursão
Mais complexo
Veremos dois métodos (iterativo e mestre)
for (...) {
... // CustoFor }
n * custoFor
Número de Iterações
33
E
XERCÍCIO1
Quais as primitivas do algoritmo a seguir?
public int max(int x, int y) {
if (x > y)
E
XERCÍCIO1
Quais as primitivas do algoritmo a seguir?
public int max(int x, int y) {
if (x > y)
return x;
else return y;
}
35
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
long r = 1;
for (int i=1; i<=n; i++)
r=2*r;
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
long r = 1;
for (int i=1; i<=n; i++)
r=2*r;
return r;
}
37
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
long r = 1;
for (int i=1; i<=n; i++)
r=2*r;
return r;
}
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
long r = 1;
for (int i=1; i<=n; i++)
r=2*r;
return r;
}
)
custo (
39
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
long r = 1;
for (int i=1; i<=n; i++)
r=2*r;
return r;
}
)
custo (
) +
custo (
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
for (int i=1; i<=n; i++)
r=2*r;
return r;
}
)
c1
+
custo (
) +
custo (
41
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
for (
int i=1
;
i<=n
;
i++
)
+
r=2*r;
return r;
}
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
for (
c1
;
i<=n
;
i++
)
+
r=2*r;
return r;
}
)
c1
+
n*custo (
) +
custo (
43
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
for (
c1
;
c2*n
;
i++
)
+
r=2*r;
return r;
}
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
for (
c1
;
c2*n
;
c3*(n-1)
)
+
r=2*r;
return r;
}
)
c1
+
n*custo (
) +
custo (
45
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
c1 +
c2*n + c3*(n-1)
+
r=2*r;
return r;
}
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
c1 +
c2*n + c3*(n-1)
+
return r;
}
)
c1
+
n*c4 +
custo (
47
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
c1 +
c2*n + c3*(n-1)
+
}
E
XERCÍCIO2
Quais as primitivas do algoritmo a seguir?
long potencia(int n) {
c1 +
c2*n + c3*(n-1)
+
}
c1
+
n*c4 +
c5
custo = 2*c1 + c2*n + c3*(n-1) + n*c4 + c5
49T
IPOS DEA
NÁLISES0 1 2 3 4 5 6
1 2 3 4 5 6 7
tamanho da entrada
M
ELHOR, P
IOR EC
ASOM
ÉDIO Pior Caso Mais comum
T(n) = tempo máximo para um algoritmo com qualquer entrada de tamanho n
Fácil de calcular (sem probabilidade)
Caso Médio
T(n) = tempo esperado sobre todas as entradas de tamanho n
Precisa de uma hipótese da distribuição estatística das entradas
Melhor Caso
Não acrescenta muita informação
Raramente ocorre na prática
Logo, não é uma boa medida 51
E
XERCÍCIO4
Qual a expressão do tempo de execução de cada algoritmo?
boolean primo(int n) { if (n==2) return true; for (int i=2; i<n; i++) if (n%i==0)
return false; return true;
}
boolean primo(int n) { if (n==2) return true; for (int i=2; i<=n/2; i++) if (n%i==0)
return false; return true;
C
OMPLEXIDADE
X
H
ARDWARE
Supercomputador 109 instruções/seg
2n2 Computador
107 instruções/seg
50nlog10(n) Algoritmo de Ordenação 53
A
NÁLISEQuem ordenará mais rápido com n=106?
50.106.log
10106/107≈ 30 segundos
2.1012/109 = 2000 segundos
109 instr/s
2n2
107 instr/s