Vous êtes sur la page 1sur 44

Estruturas de Dados e

Ordenao
Baseado em:
The Algorithm Design Manual
Steven S. Skiena

Introduo (1)

A alterao de uma estrutura de


dados em um programa lento pode
mudar sensivelmente seu tempo de
execuo.
Esta alterao no muda a corretude
do programa.
importante projetar os programas
tendo as estruturas de dados como
centro.

Introduo (2)

importante construir os programas de


forma que implementaes alternativas
possam ser experimentadas.
importante separar os componentes
da estrutura de dados de sua interface.
Esta abstrao de dados importante
para a limpeza, leitura e modificao
dos programas.

Observaes (1)

A construo de algoritmos em torno de


estruturas de dados tais como dicionrios e
filas de prioridades leva a estruturas limpas
e bons desempenhos.
A escolha errada de uma estrutura de dados
pode ser desastroso para o desempenho.
A escolha da melhor estrutura de dados no
to crtica, pois podem existir outras
escolhas que se comportam similarmente.

Observaes (2)

A ordenao uma das partes principais


de um algoritmo. Deveria ser a primeira
coisa a ser feita para buscar eficincia.
A ordenao pode ser usada para ilustrar
muitos paradigmas de projeto de
algoritmos. Tcnicas de estruturas de
dados, diviso e conquista,
randomizao e construo incremental
levam a algoritmos de ordenao.

Tipos de dados
fundamentais

Um tipo de dado abstrato uma


coleo de operaes bem
definidas que podem ser feitas em
uma estrutura particular.
So estas operaes que definem
o que a estrutura faz, mas no
como ela funciona.

Containers

uma estrutura de dados que permite


o armazenamento e a recuperao de
dados independentemente de seu
contedo.
As operaes fundamentais so:

Put(C,x) insere o dado x no container C.


Get(C) recupera o prximo item do
container C. Tipos diferentes de containers
admitem diferentes tipos de recuperao,
baseado na ordem ou posio de insero.

Containers (2)

A utilidade de containers maior


quando a quantidade de dados
limitada e a ordem de recuperao
pr-definida ou irrelevante.
Tipos de containers:

Pilhas
Filas
Tabelas

Pilhas

LIFO.
Simples de implementar.
o container correto quando a
ordem de recuperao no
importa.
Operaes: push (Put) e pop (Get).

Filas

FIFO.
Parece ser a melhor maneira de controlar
tempos de espera.
So mais difceis de implementar do que
pilhas e so apropriadas apenas em
aplicaes em que a ordem importante.
Operaes: enqueue (Put) e dequeue
(Get).

Tabelas

Aceitam recuperao pela posio.


As operaes de Put e Get
aceitam um ndice como
argumento.
Tabelas so geralmente
implementadas utilizando arrays.

Implementao de
containers

Pode-se usar arrays ou listas ligadas.


A escolha entre uma ou outra depende
do conhecimento da quantidade de
dados a ser armazenada.
Com o uso de arrays, as operaes Put
e Get podem ser implementadas em
tempo constante.

Dicionrios

So uma forma de container que


permite acesso aos dados armazenados
pelo seu contedo.
As principais operaes so:

Search(D,k) Dada uma chave k, retorna


um ponteiro para um elemento em D cujo
valor k, se existir.
Insert(D,x) Insere o dado de valor x em D.
Delete(D,x) Dado um ponteiro para um
item de valor x, remove-o de D.

Implementao

Lista ligada desordenada

Array ordenada

Insero e remoo em tempo constante.


Consulta atravessa a lista toda.
Consulta por busca binria em tempo O(log
n).
Insero e remoo levam tempo linear.

rvore de Busca Binria


Tabelas de Hash

vores de Busca Binria

Operaes sobre dicionrio so rpidas.


uma rvore com raiz na qual cada n
contm no mximo dois filhos.
Os filhos recebem os rtulos right ou left,
conforme sua posio em relao ao pai.
Os ns so rotulados com as chaves de
forma que todos os ns da subrvore
esquerda de um n x tenham valores
menores que x e todos direita tenham
valores maiores que x.

Consulta
BinaryTreeQuery(x,k)
if (x=nil) or (k=key[x])
then return x
if (k < key[x])
then return BinaryTreeQuery(left[x],k)
else return BinaryTreeQuery(right[x],k)

Tempo O(h), h a altura da rvore.

Insero

O item a ser inserido deve ser


colocado na ltima posio em que
pode ser encontrado.
Esta posio determinada ao fazerse uma busca pelo valor a ser
inserido.
A insero propriamente dita leva
tempo constante aps a determinao
deste local (que leva tempo O(h)).

Remoo

mais difcil que a insero, pois o n a


ser removido pode no ser uma folha.
A remoo de folhas fcil, mas a
simples remoo de um n interno no
permite acesso aos itens abaixo dele.
Uma reestruturao ou rerotulao dos
ns, de forma a levar o item a ser
removido para uma folha, necessrio.

Implementao (1)

Todas as operaes levam tempo


O(h).
A menor altura possvel O(log n),
quando a rvore est perfeitamente
balanceada.
Ao inserirmos aleatoriamente os
dados em uma rvore, a
probabilidade da rvore resultante
ter altura O(log n) grande.

Implementao (2)

O pior caso ocorre quando a rvore


um caminho.
Para evitar o desbalanceamento
usa-se estruturas mais sofisticadas
como, por exemplo, rvores rubronegras.

Filas de Prioridade (1)

Utilizadas em aplicaes onde os itens so


processados em uma ordem particular.
Por exemplo, o escalonamento de tarefas.
As filas de prioridade apresentam vantagem
sobre a ordenao pois as tarefas entram no
sistema em intervalos arbitrrios.
mais caro reordenar do que manter os
dados em uma fila de prioridade.

Filas de Prioridade (2)

As principais operaes so:

Insert(Q,x) inserir o item x na fila Q.


Find_Minimum(Q) ou Find_Maximum(Q)
retorna um ponteiro para o menor ou
maior valor em Q.
Delete_Minimum(Q) ou
Delete_Maximum(Q) remove da lista Q
o item com menor ou maior valor.

Implementao (1)

Qualquer uma delas leva tempo O(log n),


representando os dados por uma rvore
de busca binria.
A busca do menor (maior) valor pode ser
feita buscando-se o valor mais
esquerda (direita) na rvore.
A insero feita como na rvore.
A remoo consiste em uma busca
seguida da remoo de um n da rvore.

Estruturas de Dados
Especializadas (1)

As estruturas vistas mostram uma


representao para um conjunto
desestruturado de dados de forma a
facilitar operaes de recuperao.
Existem tambm estruturas de
dados potentes utilizadas para
representar tipos de objetos mais
bem estruturados tais como pontos
no espao, cadeias e grafos.

Estruturas de Dados
Especializadas (2)

Para estes dados:

Existe um conjunto de operaes


bsicas que devem ser feitas
repetidamente.
Procuramos estruturas de dados que
executem estas operaes
eficientemente.

Cadeias (Strings)

Representadas geralmente por arrays


de caracteres, com possivelmente um
caracter especial para designar o fim
da cadeia.
rvores de sufixos e Arrays de sufixos
so estruturas de dados especiais para
o pr-processamento de cadeias para
tornar a busca de padres rpida.

Dados Geomtricos

Consiste geralmente de colees de


pontos e regies.
Regies no plano so descritas por
polgonos, cujas fronteiras so dadas
por cadeias de segmentos de reta.
Estruturas de dados espaciais, tais
como kd-trees organizam os pontos e
regies pela localizao geomtrica
de forma a tornar a busca rpida.

Grafos

Geralmente so representados por


matrizes de adjacncia ou por
listas de adjacncia.
A escolha da representao
importante no algoritmo
resultante.

Conjuntos

Subconjuntos de itens so
geralmente representados usando
dicionrios, de forma a tornar as
consultas de pertinncia rpidas.

Ordenao (1)

A ordenao a base na qual muitos


algoritmos so construdos.
Entendendo a ordenao, tem-se
conhecimento para resolver outros
problemas.
Computadores gastam mais tempo
ordenando do que fazendo qualquer
outra coisa. A ordenao aparece em
muitos problemas na prtica.

Ordenao (2)

o problema mais estudado em


cincia da computao.
Muitas das idias usadas no
projeto de algoritmos aparecem no
contexto de ordenao, tais como
diviso e conquista, estruturas de
dados e algoritmos randomizados.

Aplicaes da Ordenao

Busca
Par mais prximo
Unicidade de elementos
Distribuio de freqncia
Seleo
Casco convexo

Busca

Uma busca binria em um


dicionrio com os dados ordenados
leva tempo O(log n).
Provavelmente esta seja a mais
simples e importante aplicao da
ordenao.

Par mais prximo

Dado um conjunto de n nmeros,


como encontrar o par de nmeros
cuja diferena entre eles seja a
menor possvel?
Com os nmeros ordenados a
soluo simples.
Soluo em tempo O(n logn) .

Unicidade de elemento

Dado um conjunto de n elementos,


existem elementos duplicados?
Novamente, a melhor soluo
possvel usa a ordenao.
um caso particular do problema
do par mais prximo em que a
diferena entre vizinhos zero.

Distribuio de freqncia

Dado um conjunto de n elementos,


qual elemento ocorre o maior
nmero de vezes?

Seleo

Qual o k-simo maior elemento no


conjunto?
Com os dados ordenados, esta
informao determinada em
tempo constante.
Em particular, a mediana (o n/2simo elemento).

Casco convexo (1)

Dado um conjunto de n pontos no


plano cartesiano, qual o polgono
convexo de menor rea que contm
todos estes pontos?
Os pontos so ordenadas pelas
abscissas dos pontos.
A partir do ponto de menor abscissa, o
casco construdo inserindo-se os
pontos.

Estruturas de Dados

Ordenao por seleo.


Implementao usando um vetor
desordenado, leva:

O(1) para reposicionar o elemento, e


O(n) para localizar o elemento.

Ordenao por seleo leva tempo O(n).


Se usarmos um heap ou rvore de busca
balanceada o algoritmo leva tempo O(n log n),
heapsort

Insero incremental

Ordenao por insero


um dos exemplos mais simples
da tcnica de insero
incremental.
uma tcnica particularmente til
em algoritmos geomtricos.

Diviso e conquista

Ordenao por intercalao


Um problema grande pode ser
dividido em problemas menores
que so resolvidos. A soluo de
cada um deles ento combinada
para obter-se a soluo do
problema inicial.

Randomizao

Quicksort
Os pivs so escolhidos
aleatoriamente.
Com esta escolha, o algoritmo tem
alta probabilidade de ser
executado em tempo (n log n).
No pior caso quadrtico.

Tcnica de Encestamento

Segundo algum critrio os dados so


agrupados em cestos (buckets) e os
cestos so tratados individualmente.
Esta idia esta presente em tabelas
de hash, kd-trees, e em outras
estruturas de dados prticas.
A tcnica boa quando os dados
ficam uniformemente distribudos
entre os cestos.