ESTRUTURAS DE DADOS E ALGORITMOS APRESENTAÇÃO DO CURSO E INTRODUÇÃO Adalberto Cajueiro (adalberto@computacao.ufcg.edu.br) Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1
APRESENTAÇÃO DO CURSO Cré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. 2
APRESENTAÇÃO DO CURSO Pá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/l edaufcg/ Para cada disciplina existe um grupo associado (acessível através da página da disciplina) Solicitem para serem adicionados nos grupos URGENTE! Use seu email no domínio ccc.ufcg.edu.br para acessar o TST (tst-eda.splab.ufcg.edu.br)! 3
DICAS PARA A DISCIPLINA (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. Conversar com a turma anterior. 4
DICAS PARA A DISCIPLINA (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
AVALIAÇÃO (INFORMAÇÃO NO SITE) EDA 3 provas teóricas LEDA 3 provas práticas roteiros Nota combinada 6
INICIANDO 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. Uma sequencia finita de passos/instruções que transformam um conjunto de valores em uma dada situação inicial em uma situação final que satisfaz condições específicas. 8
EXEMPLOS DE ALGORITMOS Receita 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
PROGRAMAS X ALGORITMOS Algoritmo Idéia usada para computar alguma coisa Expresso em diversas linguagens naturais Programa Texto que descreve um sistema computacional Expresso em notacoes projetadas para computadores 10
ESCRITA DE ALGORITMOS Linguagem natural? Linguagem de Programação (código)? Pseudo-código? Linguagem Humana pseudo-código Código 11
EXEMPLO Faça um programa que calcula as médias acumuladas de um vetor V com n inteiros. A média deve ser armazenada em um vetor M de n reais. 12
EXEMPLO double[] 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
CRITÉRIOS DE AVALIAÇÃO Corretude Se para toda entrada especificada a saída correta é produzida Simplicidade Facilmente entendido, implementado e mantido Eficiência Inversa da quantidade de recursos requeridos para seu funcionamento 14
DE VOLTA AO EXEMPLO double [] 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 } É correto? É simples? É eficiente? 15
CORRETUDE Garantir 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 Provar corretude de algoritmos não é fácil! 16
SIMPLICIDADE Voce teria dificuldade em implementá-lo? Voce teria dificuldades em encontrar erros em uma implementação de outra pessoa? 17
EFICIÊNCIA Nã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. Comparação com algoritmos que resolvem o mesmo problema ajudam muito na prática. 18
EFICIÊNCIA A eficiência de um algoritmo é relevante? 19
EFICIÊNCIA Por 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? Complexidade x Eficiência 20
EFICIÊNCIA Mé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
ABORDAGEM EXPERIMENTAL Executar 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(); long tempo = depois antes; 22
ABORDAGEM EXPERIMENTAL t (ms) +- 50 medições 1 1 1 1 1 11111111 Algoritmo n Tamanho da entrada 23
Quais fatores influenciam? 24
ABORDAGEM EXPERIMENTAL Fatores que influenciam Tamanho da entrada (n) Hardware Processador Memória Software Sistema Operacional Linguagem de Programação Compilador C/C++ 25
ABORDAGEM EXPERIMENTAL Limitaçõ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 executar o algoritmo 26
Qual o desafio para comparar algoritmos sem executa-los? 27
Propor uma metodologia para analisar o tempo de execução dos algoritmos 28
OBJETIVOS Considerar 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 public boolean XYZ(int n, ) { } Algoritmos Análises f(n) Matemática 29
CONSIDERAÇÕES O tempo de execução de cada operação primitiva depende do hardware e software, mas de todo modo é constante Hipótese O tempo de cada operação primitiva é praticamente o mesmo 30
OPERAÇÕES PRIMITIVAS Atribuiçã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 ou Custo constante: custo(primitiva) = c 31
CUSTO DAS OPERAÇÕES Instruções Consecutivas If then else Cmd1; Cmd2; custo(cmd1) + custo(cmd2) if (teste) {... // CustoIf } else {... // CustoElse } custo(teste) + max[custo(if),custo(else)] 32
CUSTO DE OUTRAS OPERAÇÕES Laço for (...) {... // CustoFor } Número de Iterações n * custofor 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) 33
EXERCÍCIO 1 Quais as primitivas do algoritmo a seguir? public int max(int x, int y) { if (x > y) return x; else return y; } 34
EXERCÍCIO 1 Quais as primitivas do algoritmo a seguir? public int max(int x, int y) { if (x > y) return x; else return y; } 35
EXERCÍCIO 2 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; } 36
EXERCÍCIO 2 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
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? custo ( ) long potencia(int n) { long r = 1; for (int i=1; i<=n; i++) r=2*r; return r; } 38
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? custo ( long potencia(int n) { long r = 1; for (int i=1; i<=n; i++) r=2*r; return r; ) } 39
EXERCÍCIO 2 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 ( custo ( 40
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? custo ( custo ( long potencia(int n) { } c1 + for (int i=1; i<=n; i++) r=2*r; ) + return r; ) 41
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + for (int i=1; i<=n; i++) + r=2*r; return r; n*custo ( ) + custo ( ) 42
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + for ( c1 ; i<=n; i++) + r=2*r; return r; n*custo ( ) + custo ( ) 43
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + for ( c1 ; c2*n; i++) + r=2*r; return r; n*custo ( ) + custo ( ) 44
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + for ( c1 ; c2*n; c3*(n-1)) + r=2*r; return r; n*custo ( ) + custo ( ) 45
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + c1 + c2*n + c3*(n-1) + r=2*r; return r; n*custo ( ) + custo ( ) 46
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? custo ( long potencia(int n) { } c1 + c1 + c2*n + c3*(n-1) + n*c4 + ) return r; 47
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + c1 + c2*n + c3*(n-1) + n*c4 + c5 48
EXERCÍCIO 2 Quais as primitivas do algoritmo a seguir? long potencia(int n) { } c1 + c1 + c2*n + c3*(n-1) + n*c4 + c5 custo = 2*c1 + c2*n + c3*(n-1) + n*c4 + c5 49
TIPOS DE ANÁLISES Pior caso 6 tempo de execução (ms) 5 4 3 2 1 0 1 2 3 4 5 6 7 tamanho da entrada Tempo médio Melhor caso 50
MELHOR, PIOR E CASO MÉ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
EXERCÍCIO 4 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; } 52
COMPLEXIDADE X HARDWARE Computador 10 7 instruções/seg Supercomputador 10 9 instruções/seg 50nlog 10 (n) Algoritmo de Ordenação 2n 2 53
ANÁLISE Quem ordenará mais rápido com n=10 6? 10 7 instr/s 50nlog 10 (n) 50.10 6.log 10 10 6 /10 7 30 segundos 10 9 instr/s 2n 2 2.10 12 /10 9 = 2000 segundos 54
É importante não só ter uma máquina boa, mas também um algoritmo (tecnologia) eficiente! 55