ALGORITMOS E COMPLEXIDADE PROBLEMAS E ALGORITMOS Algoritmos e Complexidade 1
Plano Problemas e algoritmos. Estrutura de um algoritmo e dados manipulados. Métodos algorítmicos para resolução de problemas. Algoritmos: Pão de Ló de Alfeizerão; Soma de salários; Bubblesort; Torres de Hanoi; Tree sort; Merge sort; Rodovia mais barata; Caminho mais curto. Algoritmos e Complexidade 2
Um pouco de história Etimologia Algorismo Astrónomo matemático persa Abu Já Far Mohammed Ibn Musa Al-Khowarizmi [Bagdad; 780-850] corruptela de Al-Khowarizmi aquando da tradução europeia para o latim (século XII) do seu livro de Álgebra descrevendo processos para adicionar, subtrair, multiplicar e dividir números decimais. Algoritmos e Complexidade 3
Um pouco de história Algoritmo de Euclides - o primeiro algoritmo não trivial Professor, matemático e escritor de origem desconhecida Euclides de Alexandria [-325.. - 265] Para calcular o máximo divisor comum entre dois números naturais, subtrair o menor ao maior até ficarem iguais. x y 3 6 2 0 1 6 2 0 1 6 4 1 2 4 8 4 4 4 Definição 1: Algoritmos são prescrições de processos que quando executados permitem a resolução de problemas Algoritmos e Complexidade 4
Departamento de Ciências e Tecnologias da Informação Um algoritmo para um problema delicioso Receita do Pão de Ló de Alfeizerão Ingredientes: 100 grs de açúcar 6 gemas 2 ovos 50 grs de farinha Confecção: Batem-se os ovos inteiros com o açúcar até a mistura ficar esbranquiçada. Juntam-se as gemas desfeitas e bate-se tudo muito bem até ficar cremoso. Envolve-se a farinha bem peneirada. Deita-se a massa numa forma forrada com um papel grosso. Leva-se a cozer em forno quente até ficar cozido nas bordas. Retira-se do forno e desenforma-se. C Algoritmos utilizam instruções elementares de um conjunto pré-definido em função das capacidades/experiência de quem as lê e executa (hardware/cozinheiro experiente) C Programas são algoritmos que podem ser lidos e executados por computador C Uma vez que se pretende discutir problemas que podem ser resolvidos computacionalmente, vamos aqui considerar apenas algoritmos precisos cujas acções elementares podem ser definidas precisamente/sem ambiguidade e executadas em tempo finito por um computador. Algoritmos e Complexidade 5
Problemas, Algoritmos e Computadores Um problema, consistindo em: 1. Caracterização de uma colecção de entradas / inputs potenciais (possivelmente em número infinito); 2. Especificação das saídas/outputs desejados em função dos inputs. Definição 2: Um algoritmo é uma solução de um problema. É composto por instruções elementares de um conjunto pré-definido e deve ser capaz de produzir o outputs especificado para cada um dos inputs potenciais. Exemplo Problema: Dados x,y N (input), calcular mdc(x,y) (output) Problema Algorítmico Solução algorítmica Solução/Algoritmo: Subtrair o menor ao maior até ficarem iguais Algoritmos e Complexidade 6
Estrutura de um algoritmo As instruções elementares de um algoritmo podem ser organizadas por estruturas de controlo que especificam a ordem com que as instruções devem ser executadas. Sequência {A B D fazer A e de seguida fazer B e de seguida fazer D Alternativa if(q) A else B se Q então fazer A caso contrário fazer B Iteração while(q)a fazer A enquanto Q for( Subrotinas permite definir novas instruções Output subrotina(input parametro) Algoritmos e Complexidade 7
Dados manipulados por um algoritmo A informação manipulada por um algoritmo é guardada em variáveis estruturadas de diversas maneiras (Tipos). Números, caracteres, booleanos, palavras int, long, float, double, char, boolean, String Arrays combinando várias variáveis todas do mesmo tipo 4 5 2 1 4 9 0 3 7 0 1 7 9 8 5 Registos/Objectos combinando variáveis de tipos diferentes + operações Xavier 600 Algoritmos e Complexidade 8
Dados manipulados por um algoritmo Pilhas (sequência de elementos com disciplina de acesso LIFO) Filas (sequência de elementos com disciplina de acesso FIFO) Árvores (elementos dispostos hierarquicamente) Algoritmos e Complexidade 9
Dados manipulados por um algoritmo Grafos (elementos dispostos em rede) Algoritmos e Complexidade 10
Exemplos de algoritmos Problema máximo divisor comum : Dados x,y N (input), calcular mdc(x,y) (output) Solução: int euclides(int x,int y){ while(x!= y){ if(x>y) x = x y; else y = y x; return x ; Algoritmos e Complexidade 11
Exemplos de algoritmos Problema soma dos n primeiros naturais : Dado n N (input), calcular 1+2+3+ +n (output) Solução 1: int soma(int n){ int s = 0, i = 1; while(i <= n){ s = s + i; i = i + 1; return s; Algoritmos e Complexidade 12
Exemplos de algoritmos Problema soma dos n primeiros naturais : Dado n N (input), calcular 1+2+3+ +n (output) Solução 2: Solução de Carl Friedrich Gauss [1777.. 1855] 5 + 1 = 6 4 + 2 = 6 3 + 3 = 6 2 + 4 = 6 1 + 5 = 6 5 1 4 2 3 3 2 4 1 5 1 + 2 + 3 + 4 + 5 = 5x6/2 1 + 2 + + 100 = 100x101/2 int soma(int n){ return n*(n+1)/2; Algoritmos e Complexidade 13
Exemplos de algoritmos Problema soma de salários : Dado um array de n N empregados (input), calcular a soma dos seus salários (output) Solução : class Empregado{ String nome; float salário; Empregado(String nome, float salário){ this.nome = nome; this.salário = salário; float somasalarios(empregado[] empregados, int n){ float soma = 0; for(int i = 0; i < n; i = i +1) soma = soma + empregados[i].salário; return soma; Algoritmos e Complexidade 14
Exemplos de algoritmos traço da execução: Xavier Maria Ana Gustavo 600 300 1500 3500 soma = 0 i = 0 soma = 600 i = 1 soma = 900 i = 2 soma = 2400 i = 3 soma = 5900 i = 4 Algoritmos e Complexidade 15
Exemplos de algoritmos Problema ordenação : Dado um array de n N empregados (input), ordenar os empregados por nome (output) Solução: Empregado[] bublesort(empregado[] empregados, int n){ for(int i = 0; i < n-1; i = i +1){ for(int j = 0; j < n-1; j = j +1){ if(empregados[j].nome > empregados[j+1].nome){ Empregado aux = empregados[j]; empregados[j] = empregados[j+1]; empregados[j+1] = aux; return empregados; Algoritmos e Complexidade 16
Exemplos de algoritmos traço da execução: Xavier Maria Ana Gustavo 600 300 1500 3500 Maria Xavier Ana Gustavo 300 600 1500 3500 Maria Ana Xavier Gustavo 300 1500 600 3500 Maria Ana Gustavo Xavier 300 1500 3500 600 Ana Maria Gustavo Xavier 1500 300 3500 600 Ana Gustavo Maria Xavier 1500 3500 300 600 Algoritmos e Complexidade 17
Exemplos de algoritmos Problema Torres de Hanoi : Édouard Lucas, Nouveaux jeux scientifiques. La Nature, 17:301 303, 1889. http://www.prof2000.pt/users/pjca/jogos_ficheiros/hanoi/torre%20de%20hanoi.html São dados n discos de diâmetro 1, 2,, n dispostos por ordem decrescente de diâmetro num de 3 postes. Pretende-se transferir todos os discos para um dos outros postes, respeitando as seguintes restrições: 1. apenas um disco pode ser movido de cada vez, 2. apenas se podem mover os discos do topo 3. nenhum disco pode ser colocado sobre outro menor. Algoritmos e Complexidade 18
Departamento de Ciências e Tecnologias da Informação Exemplos de algoritmos Solução: Algoritmos e Complexidade 19
Exemplos de algoritmos Solução: void Hanoi(int n, char posteinicial, char postefinal, char posteauxiliar){ if(n == 1) System.out.println(posteInicial + + postefinal); else{ Hanoi(n-1, posteinicial, posteauxiliar, postefinal); System.out.println(posteInicial + + postefinal); Hanoi(n-1, posteauxiliar, postefinal, posteinicial); Algoritmos e Complexidade 20
Exemplos de algoritmos traço da execução: Hanoi(3,A,B,C) Hanoi(2,A,C,B) Hanoi(2,C,B,A) Hanoi(1,A,B,C) Hanoi(1,B,C,A) Hanoi(1,C,A,B) Hanoi(1,A,B,C) A B A C B C A B C A C B A B Algoritmos e Complexidade 21
Departamento de Ciências e Tecnologias da Informação Exemplos de algoritmos Problema ordenação : Dado uma lista de n N números (input), ordenar os números por ordem crescente (output) Solução tree sort : Transformar a lista de input numa árvore binária de pesquisa e de seguida atravessar a árvore em travessia infixa. traço da execução: Algoritmos e Complexidade 22
Departamento de Ciências e Tecnologias da Informação Exemplos de algoritmos Solução merge sort : traço da execução: 1. Dividir a lista de input em duas metades (a esquerda e a direita); 2. ordenar a lista esquerda; 3. ordenar a lista direita; 4. juntar as duas listas para obter uma lista final ordenada. Algoritmos e Complexidade 23
Métodos algorítmicos para resolução de problemas Como encontrar soluções para problemas? Não existe uma receita fácil para o sucesso! Mas, alguns algoritmos seguem um padrão particular. Incrementais Incrementalmente exploram todos os elementos de uma estrutura de dados e constroem uma solução. Solução Incremental(Dados d){ resultado = valorinicial; for( cada x elemento de d ) actualiza(resultado); return resultado; Exemplos: soma de salários, ordenação tree sort Algoritmos e Complexidade 24
Métodos algorítmicos para resolução de problemas Dividir para conquistar Solução DividirparaConquistar(Prolema p){ if(fácil(p)) Resolver(p); else{ Dividir(p) em p1 e p2; sol1 = DividirparaConquistar(p1); sol1 = DividirparaConquistar(p2); solução = Combinar(p1,p2); return solução; Exemplos: Torres de Hanoi, ordenação merge sort Algoritmos e Complexidade 25
Métodos algorítmicos para resolução de problemas Gulosos A escolha óptima local conduz à escolha óptima global. Problema Rodovia mais barata : Dada uma rede de n N cidades com os preços de cada ligação (input), qual a rodovia mais barata unindo todas as cidades (output) Solução: 1. Escolhe-se a ligação mais barata ; 2. Enquanto houver ligações ainda por considerar 2.1 Escolhe-se a ligação que permitir estender a rodovia de modo mais barato e sem introduzir ciclos; Algoritmos e Complexidade 26
Métodos algorítmicos para resolução de problemas traço da execução: Algoritmos e Complexidade 27
Métodos algorítmicos para resolução de problemas Planeamento/Programação dinâmica A escolha óptima global é obtida considerando todas as combinações de: 1. decisões simples (locais); e 2. a escolha óptima global das restantes decisões. Problema Caminho mais Curto : Dada uma rede de n N cidades com os preços de cada ligação e duas cidades dessa rede (input), qual o caminho mais curto entre A e B. Solução: 1. Enquanto houver cidades X directamente ligadas a A 1.1 Calcular o comprimento do caminho mais curto de X a B 2.O caminho final A continua com a cidade X para a qual se tem o mínimo valor do comprimento de A a X + comprimento do caminho mais curto entre X e B Algoritmos e Complexidade 28