estruturas de dados e complexidade de algoritmos prof. dr. lucídio dos anjos formiga cabral...
TRANSCRIPT
![Page 1: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/1.jpg)
Estruturas de Dados e Complexidade de Algoritmos
Prof. Dr. Lucídio dos Anjos Formiga CabralPPGI/UFPB
Março/2009
![Page 2: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/2.jpg)
Descrição do curso
• Conteúdo– Introdução– Fundamentos de algoritmos– Análise da eficiência de algoritmos– Ordenação e estatísticas de ordem– Estruturas de dados avançadas– Técnicas avançadas de projeto e análise– Tópicos selecionados– Problemas NP-Completos
![Page 3: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/3.jpg)
Bibliografia
• Básica:– CORMEN, T.; LEISERSON, C.; RIVEST, R.; STEIN, C.; Algoritmos:
Teoria e Prática, Editora Campus, Rio de Janeiro, 2002.
• Complementar– GOODRICH, M. T., TAMASSIA R., Projeto de Algoritmos, Editora
Bookman, Porto Alegre, 2004.– ZIVIANI, N., Projeto de Algoritmos, Editora Pioneira Thomson, Belo
Horizonte, 2004.– Knuth, D., The Art of Computer Programming, Volumes 1,2 e 3,
Addison-Wesley,1997.– TOSCANI, L. V.; VELOSO. PAULO A. S. Complexidade de
Algoritmos, Editora Sagra-Luzzatto, 2001.– SZWARCFITER, J.; Grafos e Algoritmos Computacionais, Editora
Campus, Rio de Janeiro, 1984.– TERADA, R.; Desenvolvimento de Algoritmos e Estrutura de Dados.
Editora Makron Books, 1991.
![Page 4: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/4.jpg)
Organização do Curso
• Página do cursowww.di.ufpb.br/~lucidio/complexest.htm
• 3 provas escritas
![Page 5: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/5.jpg)
Introdução
• O que é um algoritmo?– São as idéias implícitas nos programas de
computadores.– Corresponde a um conjunto bem definido de
regras que especificam uma seqüência de operações a serem aplicadas a um conjunto de dados, chamado entrada, produzindo após uma quantidade finita de tempo um conjunto de dados chamado saída.
– Também chamado de processo, procedimento computacional, etc.
– Pode ser implementado de diferentes formas.
![Page 6: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/6.jpg)
O que será estudado?
• Objetivos principais:– Um conjunto de ferramentas práticas: uma
coleção de algoritmos fundamentais para uso em outros cursos, ou em seus trabalhos futuros.
– Estudo teórico: uma avaliação dos aspectos envolvidos no projeto, análise ou seleção de um algoritmo para um novo problema.
![Page 7: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/7.jpg)
Exemplos de algoritmos
2 – Número Primo
Entrada: Uma número natural q.Saída: sim ou não, dependendo se q é primo.
NÓS BUSCAMOS ALGORITMOS QUE SEJAM CORRETOS E EFICIENTES !!!
1 - Ordenação
Entrada: Uma seqüência de n números ‹a1, a2, ..., an›.
Saída: Uma reordenação da seqûëncia de entrada ‹a'1, a'2, ...,a'n›,
onde a'1 ≤ a'2 ≤ ... ≤ a'n
![Page 8: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/8.jpg)
Problemas
• Estudaremos os problemas computacionais, que consistem de uma descrição geral da questão a ser respondida, em geral, envolvendo algumas variáveis livres ou parâmetros.
• Uma instância de um problema computacional é uma questão específica obtida por associar valores aos parâmetros do problema.
![Page 9: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/9.jpg)
Problema do Caixeiro Viajante
• Instância: Um conjunto de cidades X juntamente com a informação de distância d(x,y) entre qualquer par x, y pertencentes a X.
• Questão: Qual é a menor rota circular que inicia e termina em uma dada cidade e visita todas as cidades?
![Page 10: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/10.jpg)
Problema Computacional
• Um instância de um problema computacional é um possível valor para a entrada.– ‹45, 7, 13, 23, 2› é uma instância para o problema da
ordenação.– 29 é uma instância para o problema dos números
primos.
• Um algoritmo está correto se, para qualquer instância, ele termina e retorna como saída o valor esperado.
![Page 11: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/11.jpg)
Como expressar algoritmos?
• Aspectos como precisão e facilidade de expressão são importantes.
• Três formas– Linguagem natural– Pseudo-Código– Linguagem de Programação
• Infelizmente, quanto maior a facilidade de expressão menor é a precisão.
![Page 12: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/12.jpg)
Corretude
• Para qualquer algoritmo, nós devemos provar que ele sempre retorna a saída desejada para todas as instâncias válidas do problema.
• Para a ordenação, isto deve ser válido ainda que a entrada já esteja ordenada, ou que contenha elementos repetidos
![Page 13: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/13.jpg)
Quão bom é um dado algoritmo?
• Existem muitas considerações envolvendo esta questão?– Corretude
• Corretude teórica• Estabilidade númerica
– Eficiência• Complexidade• Velocidade• Uso de outros recursos
![Page 14: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/14.jpg)
Corretude não é óbvia!
• O seguinte problema aparece em aplicações de manufatura e transporte.
• Suponha que você tenha um braço de robô equipado com um soldador. Para habilitar o braço do robô a soldar todos os pontos de contato, devemos construir uma ordem de visita aos pontos.
• Desde que robôs são caros, nós precisamos encontrar a ordem que minimiza o tempo (ou distância percorrida) que ele gasta para efetuar a solda nos pontos desejados.
Imagine um algoritmo para encontrar o melhor percurso!
![Page 15: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/15.jpg)
Estratégia do vizinho mais próximo
• Uma solução muito popular inicia em algum ponto p0 e então caminha em direção ao vizinho mais próximo, digamos p1, e repete o procedimento.
• AlgoritmoVisite o ponto inicial p(0)
P = p(0)
i = 0
Enquanto existir ponto não visistado
i = i + 1
Seja p(i) o ponto não visitado, mais próximo de p(i-1)
Visite p(i)
Retorne para p(0) a partir de p(i)
• Este algoritmo é simples de entender e implementar e muito eficiente. Entretanto .............
![Page 16: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/16.jpg)
Estratégia do vizinho mais próximo
• Entretanto, ele não é CORRETO!!!
Adotar a estratégia de sempre começar pelo ponto mais à esquerda ou a partir de qualquer outro ponto não corrige o problema.
![Page 17: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/17.jpg)
Um algoritmo correto
• Nós podemos tentar todas as ordens possíveis dos pontos e então selecionar a ordem que minimiza o comprimento total.
• Algoritmod = INF
Para cada uma das n! Permutações Pi dos n pontos
Se (custo(Pi) <= d) então
d = custo(Pi)
Pmin = Pi
Retorne Pmin
• Desde que todas as ordens possíveis são consideradas, tem-se a garantia de terminar com o percurso (ciclo) de menor custo possível.
• Para valores ainda modestos de n este algoritmo se torna inviável.• Nenhum algoritmo correto eficiente existe para o problema do caixeiro
viajante.
![Page 18: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/18.jpg)
O modelo RAM
• Algoritmos são a única parte durável, importante e original da ciência da computação porque podem ser estudados de modo independente da linguagem e da máquina.
• Assim sendo, faremos toda a nossa análise baseada no modelo de computação RAM (Máquina de Acesso Aleatório).
– Cada operação simples (+, -,=,if, call) toma exatamente um passo.– Laços e chamadas de procedimentos não são operações simples,
mas dependem sobre o tamanho da entrada e do conteúdo do procedimento.
– Cada acesso a memória toma exatamente um passo
• Nós medimos o tempo de execução de um algoritmo contando o número de passos.
![Page 19: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/19.jpg)
Complexidade de melhor, médio e pior caso
• A complexidade de pior caso de um algoritmo é a função definida pelo número máximo de passos tomados sobre qualquer instância de tamanho n.
• A complexidade de melhor caso de um algoritmo é a função definida pelo número mínimo de passos tomados sobre qualquer instância de tamanho n.
• A complexidade de caso médio de um algoritmo é a função definida pelo número médio de passos tomados sobre qualquer instância de tamanho n.
![Page 20: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/20.jpg)
Ordenação por Inserção
• Uma maneira de ordenar um vetor de n elementos é iniciar com uma lista vazia e sucessivamente inserir novos elementos na posição correta:
• Em cada estágio, o elemento inserido forma uma lista ordenada e após n inserções tem-se a lista totalmente ordenada.
• Quão eficiente é este algoritmo?• O tempo de execução muda para instâncias diferentes!!!!• Como esse algoritmo se comporta para uma lista já ordenada na
entrada?• E para uma lista ordenada em ordem inversa?
![Page 21: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/21.jpg)
Análise exata da ordenação por inserção• Contaremos o número de vezes que cada linha do pseudo-código será
executada.
![Page 22: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/22.jpg)
Análise exata da ordenação por inserção
• Para calcular T(n) do algortimo de ordenação, faremos:
![Page 23: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/23.jpg)
Análise exata da ordenação por inserção• Melhor caso: lista ordenada de elementos• Avaliando o laço do enquanto podemos achar
T[ j ] <= x quando x tem valor inicial (i-1). E observamos que t(i)=1 para i=2,...,n. Portanto, o tempo de execução, neste caso é:
• O tempo de execução pode ser expresso então como:T(n) = an + b
![Page 24: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/24.jpg)
Análise exata da ordenação por inserção• Pior caso: lista ordenada na ordem inversa
– Cada elemento T[ i ] deve ser comparado com todos os elementos da lista ordenada T[1...j –1] tal que t(i)=i para i=2,3,...,n.
– Observe que:
![Page 25: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/25.jpg)
Análise exata da ordenação por inserção
• Portanto:
![Page 26: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/26.jpg)
Análise exata da ordenação por inserção
• Que pode ser expresso como:
![Page 27: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/27.jpg)
Análise do pior caso e do caso médio• Na análise do algoritmo de ordenação
consideramos o melhor e o pior caso. Vamos nos concentrar apenas no tempo de execução do pior caso, pois:– Seu tempo de execução corresponde a um limite
superior sobre o tempo de execução para qualquer instância.
– Ocorre com freqüência em alguns algoritmos.• Exemplo: pesquisa em um banco de dados por
informação não armazenada.
– Muitas vezes, o caso médio é quase tão ruim quanto o pior caso.
![Page 28: Estruturas de Dados e Complexidade de Algoritmos Prof. Dr. Lucídio dos Anjos Formiga Cabral PPGI/UFPB Março/2009](https://reader034.vdocuments.net/reader034/viewer/2022051211/552fc10d497959413d8c4489/html5/thumbnails/28.jpg)
Ordem de Crescimento
• A função obtida na análise do pior caso do algoritmo de ordenação foi a função n2+bn+c. Esta função pode ser representada pelo termo n2 que tem crescimento muito superior aos demais termos.
• A ordem de crescimento é dada pelo termo mais significante da função. No algoritmo de ordenação nós dizemos que ele é de O(n2).
• Um algoritmo é mais eficiente que outro, se seu tempo de execução no pior caso tem uma ordem de crescimento menor.