Sie sind auf Seite 1von 28

Estruturas de Dados e

Complexidade de Algoritmos
Prof. Dr. Lucdio dos Anjos Formiga Cabral
PPGI/UFPB
Maro/2009
Descrio do curso
Contedo
Introduo
Fundamentos de algoritmos
Anlise da eficincia de algoritmos
Ordenao e estatsticas de ordem
Estruturas de dados avanadas
Tcnicas avanadas de projeto e anlise
Tpicos selecionados
Problemas NP-Completos

Bibliografia
Bsica:
CORMEN, T.; LEISERSON, C.; RIVEST, R.; STEIN, C.; Algoritmos:
Teoria e Prtica, 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.

Organizao do Curso
Pgina do curso
www.di.ufpb.br/~lucidio/complexest.htm
3 provas escritas


Introduo
O que um algoritmo?
So as idias implcitas nos programas de
computadores.
Corresponde a um conjunto bem definido de
regras que especificam uma seqncia de
operaes a serem aplicadas a um conjunto
de dados, chamado entrada, produzindo aps
uma quantidade finita de tempo um conjunto
de dados chamado sada.
Tambm chamado de processo,
procedimento computacional, etc.
Pode ser implementado de diferentes formas.

O que ser estudado?
Objetivos principais:
Um conjunto de ferramentas prticas: uma
coleo de algoritmos fundamentais para uso
em outros cursos, ou em seus trabalhos
futuros.

Estudo terico: uma avaliao dos aspectos
envolvidos no projeto, anlise ou seleo de
um algoritmo para um novo problema.
Exemplos de algoritmos
2 Nmero Primo

Entrada: Uma nmero natural q.
Sada: sim ou no, dependendo se q primo.

NS BUSCAMOS ALGORITMOS QUE SEJAM
CORRETOS E EFICIENTES !!!


1 - Ordenao
Entrada: Uma seqncia de n nmeros a1, a2, ..., an.
Sada: Uma reordenao da seqncia de entrada a'1, a'2, ...,a'n,
onde a'1 a'2 ... a'n
Problemas
Estudaremos os problemas
computacionais, que consistem de uma
descrio geral da questo a ser
respondida, em geral, envolvendo
algumas variveis livres ou parmetros.

Uma instncia de um problema
computacional uma questo especfica
obtida por associar valores aos
parmetros do problema.
Problema do Caixeiro Viajante
Instncia: Um conjunto de cidades X
juntamente com a informao de
distncia d(x,y) entre qualquer
par x, y pertencentes a X.

Questo: Qual a menor rota
circular que inicia e termina em uma
dada cidade e visita todas as
cidades?
Problema Computacional
Um instncia de um problema computacional
um possvel valor para a entrada.
45, 7, 13, 23, 2 uma instncia para o problema da
ordenao.
29 uma instncia para o problema dos nmeros
primos.

Um algoritmo est correto se, para qualquer
instncia, ele termina e retorna como sada o
valor esperado.

Como expressar algoritmos?
Aspectos como preciso e facilidade
de expresso so importantes.
Trs formas
Linguagem natural
Pseudo-Cdigo
Linguagem de Programao
Infelizmente, quanto maior a
facilidade de expresso menor a
preciso.
Corretude
Para qualquer algoritmo, ns devemos
provar que ele sempre retorna a sada
desejada para todas as instncias vlidas
do problema.

Para a ordenao, isto deve ser vlido
ainda que a entrada j esteja ordenada,
ou que contenha elementos repetidos

Quo bom um dado algoritmo?
Existem muitas consideraes
envolvendo esta questo?
Corretude
Corretude terica
Estabilidade nmerica
Eficincia
Complexidade
Velocidade
Uso de outros recursos
Corretude no bvia!
O seguinte problema aparece em aplicaes de manufatura e
transporte.
Suponha que voc tenha um brao de rob equipado com um soldador.
Para habilitar o brao do rob a soldar todos os pontos de contato,
devemos construir uma ordem de visita aos pontos.
Desde que robs so caros, ns precisamos encontrar a ordem que
minimiza o tempo (ou distncia percorrida) que ele gasta para efetuar a
solda nos pontos desejados.
Imagine um algoritmo para encontrar o melhor percurso!
Estratgia do vizinho mais prximo
Uma soluo muito popular inicia em algum ponto p0 e ento caminha em
direo ao vizinho mais prximo, digamos p1, e repete o procedimento.
Algoritmo
Visite o ponto inicial p(0)
P = p(0)
i = 0
Enquanto existir ponto no visistado
i = i + 1
Seja p(i) o ponto no visitado, mais prximo 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 .............



Estratgia do vizinho mais prximo
Entretanto, ele no CORRETO!!!
Adotar a estratgia de sempre comear pelo ponto mais esquerda ou
a partir de qualquer outro ponto no corrige o problema.
Um algoritmo correto
Ns podemos tentar todas as ordens possveis dos pontos e ento
selecionar a ordem que minimiza o comprimento total.
Algoritmo
d = INF
Para cada uma das n! Permutaes Pi dos n pontos
Se (custo(Pi) <= d) ento
d = custo(Pi)
Pmin = Pi
Retorne Pmin
Desde que todas as ordens possveis so consideradas, tem-se a
garantia de terminar com o percurso (ciclo) de menor custo possvel.
Para valores ainda modestos de n este algoritmo se torna invivel.
Nenhum algoritmo correto eficiente existe para o problema do caixeiro
viajante.
O modelo RAM
Algoritmos so a nica parte durvel, importante e original
da cincia da computao porque podem ser estudados de
modo independente da linguagem e da mquina.
Assim sendo, faremos toda a nossa anlise baseada no
modelo de computao RAM (Mquina de Acesso
Aleatrio).
Cada operao simples (+, -,=,if, call) toma exatamente um passo.
Laos e chamadas de procedimentos no so operaes simples,
mas dependem sobre o tamanho da entrada e do contedo do
procedimento.
Cada acesso a memria toma exatamente um passo

Ns medimos o tempo de execuo de um algoritmo
contando o nmero de passos.


Complexidade de melhor, mdio e pior caso
A complexidade de pior caso de um algoritmo a funo definida pelo
nmero mximo de passos tomados sobre qualquer instncia de tamanho n.
A complexidade de melhor caso de um algoritmo a funo definida pelo
nmero mnimo de passos tomados sobre qualquer instncia de tamanho n.
A complexidade de caso mdio de um algoritmo a funo definida pelo
nmero mdio de passos tomados sobre qualquer instncia de tamanho n.
Ordenao por Insero
Uma maneira de ordenar um vetor de n elementos iniciar com
uma lista vazia e sucessivamente inserir novos elementos na
posio correta:

Em cada estgio, o elemento inserido forma uma lista ordenada
e aps n inseres tem-se a lista totalmente ordenada.
Quo eficiente este algoritmo?
O tempo de execuo muda para instncias diferentes!!!!
Como esse algoritmo se comporta para uma lista j ordenada
na entrada?
E para uma lista ordenada em ordem inversa?

Anlise exata da ordenao por
insero
Contaremos o nmero de vezes que cada linha do pseudo-cdigo ser
executada.

Anlise exata da ordenao por
insero

Para calcular T(n) do algortimo de ordenao, faremos:
Anlise exata da ordenao por
insero
Melhor caso: lista ordenada de elementos
Avaliando o lao 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 execuo, neste caso :



O tempo de execuo pode ser expresso ento como:
T(n) = an + b



Anlise exata da ordenao por
insero
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:

Anlise exata da ordenao por
insero
Portanto:

Anlise exata da ordenao por
insero
Que pode ser expresso como:
Anlise do pior caso e do caso
mdio
Na anlise do algoritmo de ordenao
consideramos o melhor e o pior caso. Vamos nos
concentrar apenas no tempo de execuo do
pior caso, pois:
Seu tempo de execuo corresponde a um limite
superior sobre o tempo de execuo para qualquer
instncia.
Ocorre com freqncia em alguns algoritmos.
Exemplo: pesquisa em um banco de dados por
informao no armazenada.
Muitas vezes, o caso mdio quase to ruim quanto o
pior caso.
Ordem de Crescimento
A funo obtida na anlise do pior caso do
algoritmo de ordenao foi a funo n
2
+bn+c.
Esta funo pode ser representada pelo termo n
2

que tem crescimento muito superior aos demais
termos.
A ordem de crescimento dada pelo termo mais
significante da funo. No algoritmo de
ordenao ns dizemos que ele de O(n
2
).
Um algoritmo mais eficiente que outro, se seu
tempo de execuo no pior caso tem uma ordem
de crescimento menor.

Das könnte Ihnen auch gefallen