Vous êtes sur la page 1sur 12

Algoritmos, Filas

Prof. Ricardo Reis


Universidade Federal do Cear
Estruturas de Dados
9 de Maio de 2013

Definio

de objetos que uma fila suporta denominado capacidade da fila. Uma fila vazia tem
comprimento zero e uma fila cheia possui
comprimento igual a sua capacidade.
A ordem de enfileiramento em uma fila
segue a mesma ordem de desenfileiramento. Logo o primeiro objeto enfileirado
ser o primeiro a ser desenfileirado, o segundo enfileirado ser o segundo desenfileirado e assim por diante. Por essa razo
as filas so denominadas estruturas FIFO
(do ingls, First In First Out, ou, primeiro a
entrar primeiro a sair).

Uma fila (ou queue em ingls) uma estrutura de dados linear elementar que permite armazenar e recuperar objetos sobre
as seguintes restries,
1. Objetos devem ser inseridos (enfileirados) numa extremidade (final da fila)
e removidos (desenfileirados) da outra
extremidade (incio da fila). Ver Figura1.
2. S possvel ler dados dos objetos nas
extremidades da fila (incio e final). Os
demais objetos, denominados objetos
internos, no podem ser acessados diretamente.

Operadores de Filas

Os operadores bsicos de uma fila, como


estrutura de dados, so,

3. Uma fila que no comporta mais objetos (fila cheia) deve reportar tentativas de enfileiramentos sem sucesso ao
passo que uma fila sem objetos (fila vazia) deve reportar tentativas de desenfileiramento sem sucesso.

Create:
Operador responsvel por
construir uma nova fila.
Enqueue: Operador que enfileira um
novo objeto no final de uma fila consequentemente aumentando seu comprimento em uma unidade quando a estrutura no estiver cheia.

Final
Inicio
Figura 1: Esquema de fila

Dequeue: Operador que desenfileira


o objeto no incio da fila consequentemente diminuindo seu comprimento
em uma unidade quando a estrutura
no estiver vazia.

O nmero de objetos enfileirados em uma


fila define o comprimento da fila. O mximo

Begin: Operador que retorna o valor no


objeto no incio da fila.
1

Profo . Ricardo Reis

Algoritmos, Filas
End: Operador que retorna o valor no
objeto no final da fila.

A
i

Empty: Operador que testa se a fila


est vazia.

B
f

Full: Operador que testa se a fila est


cheia.

Figura 2: Esquemas de distribuio de chaves


numa fila sequencial

Destroy: Operador que elimina uma


dada fila e seus objetos se existirem.

alm de definir os ndices i e f para zero


acusando que eles apontam para fora da
fila (lembre-se que definimos como sendo 1
o ndice mnimo dos vetores). Este apontar
para fora indica fila vazia e equivalente a
atribuio zero que se faz ao parmetro t
(comprimento da fila). De fato t no necessrio, mas mantido para que no se
precise recalcular o comprimento da fila (a
partir de i e j) sempre que requisitado. A
nova fila vazia criada pelo operador C RE ATE retornada como sada. O operador
D ESTROY faz o caminho inverso de C REATE.
Ele recebe uma fila Q de entrada, desaloca
seu vetor base M e anula os demais campos
para zero desabilitando a fila.

Filas Sequenciais

Uma fila sequencial aquela construda


utilizando-se um vetor como estrutura
base. De forma similar s pilhas, simula-se
numa fila que no existe o acesso aleatrio
no vetor base.
A Tabela-1 ilustra o descritor de uma fila
sequencial. O atributo M representa o vetor base e n seu respectivo comprimento
que nesse caso retrata a capacidade da fila.
Os atributos i e f representam respectivamente os ndices de M onde se localizam
incio e final da fila. Note que no necessariamente f maior que i. Na Figura-2, por
exemplo, so ilustrados duas situaes, A
e B, de preenchimento para o vetor M de
uma fila sequencial. No caso A, que pode
ser obtido por sete chamadas seguidas a
E NQUEUE e depois trs a D EQUEUE, i de
fato menor que f existindo nas extremidades de M clulas ainda por serem ocupadas. No caso B, que pode ser obtido por
mais cinco enfileiramentos e quatro desenfileiramentos seguidos sobre o estado A, f
menor que i, mas as clulas preenchidas
ocorrem agora nas extremidades de M e as
por preencherem, no meio.
Esta forma de aproveitamento do espao
de M construda em O(1) como ser demonstrado nas implementaes dos algoritmos dos operadores de de filas sequenciais
a seguir.
O Algoritmo-1 apresenta o operador de
construo (C REATE) e o Algoritmo-2 o de
destruo (D ESTROY) de uma fila sequencial. A finalidade maior do construtor alocar o vetor de base M (e sua capacidade n)

Algoritmo 1 Construtor de fila sequencial


1:
2:
3:
4:
5:
6:

Funo C REATE(n)
Q.M Alocar(n)
Q.n n
Q.i Q.f 0
Q.t 0
Retorne Q

Algoritmo 2 Destrutor de fila sequencial


1:
2:
3:

Funo D ESTROY(ref Q)
Desalocar Q.M
Q.i Q.f Q.t 0

O Algoritmo-3 implementa o operador de


enfileiramento em fila sequencial. Ele recebe como entrada uma referncia Q para
a fila alvo e a chave x a ser enfileirada.
Quando a fila est vazia (Q.t = 0, linha-2)
ento os valores de Q.i e Q.f (que valem
zero) so mudados para 1 (linha-3) posio
esta onde enfileirado o valor de x (linha4). Quando a fila no est vazia calcula-se
2

Profo . Ricardo Reis

Algoritmos, Filas
Tabela 1: Descritor de uma fila Sequencial
Atributo
M
n
i
f
t
Operador
C REATE
E NQUEUE
D EQUEUE
B EGIN
E ND
E MPTY
F ULL
D ESTROY

Descrio
vetor base
capacidade da fila
ndice de M que corresponde ao incio da fila
ndice de M que corresponde ao final da fila
comprimento da fila

Argumentos
n
Q, x
Q
Q
Q
Q
Q
Q

Descrio
Cria uma fila sequencial de capacidade n
Enfileira chave x no final da fila Q
Desenfileira objeto do incio da fila Q
Retorna valor no incio da fila Q
Retorna valor no final da fila Q
Verifica se a fila Q est vazia
Verifica se a pilha Q est cheia
Elimina a fila Q
Algoritmo 3 Enfileiramento em fila sequencial

a posio p de enfileiramento (linha-6) que


corresponde a f +1 quando f < n e 1 quando
f = n, ou seja, uma vez extrapolado o final
do vetor M a prxima posio a ser considerada dever ser 1. Este mecanismo conhecido como circularidade e implementado
utilizando-se o operador mod (resto de diviso entre inteiros) conforme indica a expresso,

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

p 1 + Q.f mod Q.n


na linha-6.
Quando o p calculado coincide com Q.i
significa que a fila Q est cheia e logo x
no pode ser enfileirado (o operador retorna
ento na linha-9). Do contrrio x pode ser
enfileirado para a posio p (linha-8) e Q.f
atualizado para o valor de p (linha-9). Na
linha-12 o comprimento da fila incrementado (note que isso s ocorre quando o enfileiramento se procede). O operador retorna
Verdadeiro quando o enfileiramento obtm sucesso (linha-13) e Falso (linha-11)
do contrrio.
O operador de desenfileiramento em fila
sequencial implementado pelo Algoritmo4. O operador D EQUEUE recebe a fila Q e
lhe efetua um desenfileiramento. Quando
Q no est vazia (teste da linha-2 obtm sucesso) o operador trata duas situaes: a de

Funo E NQUEUE(ref Q, x)
Se Q.t = 0 ento
Q.i Q.f 1
Q.M [1] x
seno
p 1 + Q.f mod Q.n
Se p 6= Q.i ento
Q.M [p] x
Q.f p
seno
Retorne Falso
Q.t Q.t + 1
Retorne Verdadeiro

fila contendo um elemento e a de fila contendo mais de um elemento. Se a fila contm apenas um elemento o teste da linha-3
obtm xito e os ndices Q.i e Q.f so apontados para fora da fila (linha-4). Do contrrio, se o teste na linha-3 falha ento o
incio da fila Q.i (que a extremidade de retiradas) precisa ser recalculado. Similar ao
que ocorre no enfileiramento, o reajuste de
Q.i deve ser feito pelo mecanismo da circularidade que garante que o ndice voltar a
1 ao tentar extrapolar o final de Q.M . O
novo valor de Q.i dado por,
1 + Q.i mod Q.n
3

Profo . Ricardo Reis

Algoritmos, Filas

conforme
implementado
na
linha-6.
Quando Q est vazia o teste na linha3 falha e ento procede-se a linha-8 que
retorna Falso indicando que nenhum
desenfileiramento foi realizado devido a
fila estar vazia. Na linha-9 o comprimento
da fila Q.t diminudo em uma unidade
(note que esta linha s executada se
de fato um desenfileiramento ocorrer). O
Verdadeiro retornado na linha-10 indica
desenfileiramento com sucesso.

Filas Encadeadas

Uma fila encadeada aquela que utiliza


uma lista simplesmente encadeada como
estrutura base. Em tais filas so mantidas
duas referncias, i e f , sendo i dedicada a
apontar para o nodo inicial da lista base e f
para o no do final. Quando a fila est vazia
as duas referncias apontam para .
i

Algoritmo 4 Desenfileiramento em fila sequencial


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

Funo D EQUEUE(ref Q)
Se Q.t > 0 ento
Se Q.t = 1 ento
Q.i Q.f 0
seno
Q.i 1 + Q.i mod Q.n
seno
Retorne Falso
Q.t Q.t 1
Retorne Verdadeiro

Figura 3: Esquema de fila encadeada

Na Figura-3 ilustrada uma fila encadeada. O no do-raiz da lista de base apontado por i ao passo que o ltimo no do
apontado por f . Esta ordem de escolha dos
rtulos das extremidades no aleatria.
De fato ela responsvel por manter em
O(1) as operaes de enfileiramento e desenfileiramento em filas encadeadas. Para
entender isso basta imaginar como ficam
operaes de insero e remoo de nodos
em cada extremidade. Na extremidade inicial, insero e remoo podem ser feitas
em O(1). Entretanto na extremidade final,
apesar de a insero poder ser feita em O(1)
(lembre-se que a referncia ao no do final
conhecida), a remoo deve ocorrer em O(n)
haja vista o ltimo no do no ter acesso ao
penltimo (para atualizar a referncia).
A Tabela-2 ilustra o descritor de uma
fila encadeada. Os atributos neste caso
so reduzidos, em relao s filas sequenciais, s referncias i e f respectivamente
para incio e final de fila, alm do comprimento t (quantidade de nodos). Os operadores so os mesmos das filas sequenciais distinguindo-se apenas pelo construtor,
que neste caso no possui argumentos de
entrada, e pela ausncia do operador F ULL
haja vista estruturas encadeadas no possurem restries de capacidade.
A Tabela-3 ilustra o descritor de um no
do de uma fila encadeada. exatamente a

No Algoritmo-5 so implementados os demais operadores de filas sequenciais cada


qual recebendo a fila Q de operao. Respectivamente B EGIN e E ND retornam os valores das chaves no incio e final da fila Q
(valores das chaves de Q.M nas posies
Q.f e Q.i). E MPTY e F ULL testam se a fila
est vazia (Q.t = 0) e cheia (Q.t = Q.n) respectivamente.
Algoritmo 5 Demais operadores em filas sequenciais.
1:
2:

Funo B EGIN(ref Q)
Retorne Q.M [Q.i]

3:
4:

Funo E ND(ref Q)
Retorne Q.M [Q.f ]

5:
6:

Funo E MPTY(ref Q)
Retorne Q.t = 0

Vazia?

7:
8:

Funo F ULL(ref Q)
Retorne Q.t = Q.n

Cheia?

Chave inicial

Chave final

Profo . Ricardo Reis

Algoritmos, Filas
Tabela 2: Descritor de uma fila Encadeada
Atributo
i
f
t
Operador
C REATE
E NQUEUE
D EQUEUE
B EGIN
E ND
E MPTY
D ESTROY

Descrio
Referncia para o no do inicial da fila
Referncia para o no do final da fila
comprimento da fila

Argumentos
Q, x
Q
Q
Q
Q
Q

Descrio
Cria uma fila encadeada
Enfileira chave x no incio da fila Q
Desenfileira objeto do incio da fila Q
Retorna valor no incio da fila Q
Retorna valor no final da fila Q
Verifica se a fila Q est vazia
Elimina a fila Q

Tabela 3: Descrio de um no do de uma


fila encadeada

Algoritmo 6 Construtor de fila encadeada


1: Funo C REATE
2:
Q.i Q.f
3:
Q.t 0
4:
Retorne Q

Campo Descrio
chave
Valor da chave no
no do
prox
Referncia ao no
do seguinte (vale
quando o ltimo
no do)

Algoritmo 7 Destrutor de fila encadeada


1:
2:
3:
4:
5:
6:
7:

mesma composio de um no do de lista encadeada, ou seja, possui um campo para a


chave (chave) e outro para referenciamento
do no do seguinte (prox).
O Algoritmo-6 implementa o operador de
construo e o Algoritmo-7 implementa o
operador de destruo de fila encadeada. O
construtor C REATE configura os campos i
e f de uma nova fila encadeada Q para
alm de anular o campo t. A fila criada
retornada e representa uma fila vazia. O
operador D ESTROY desaloca a fila encadeada recebida via argumento Q. O processo
semelhante a desalocao de listas encadeadas: um lao principal (linha-2) faz
avanar a raiz da estrutura (linha-4) eliminando gradativamente os nodos que vo ficando para trs (linha-5). Note que esse
lao conduz Q.i a sendo ainda necessrio, para anulao completa da fila, fazer
Q.f apontar para (linha-6) e Q.t receber
zero (linha-7).

Funo D ESTROY(ref Q)
Enquanto Q.i 6= faa
N Q.i
Q.i Q.i.prox
Desalocar N
Q.f
Q.t 0

No Algoritmo-8 implementado o operador E NQUEUE de enfileiramento de uma


chave x, passada como argumento, em uma
fila encadeada Q. Neste operador criado
um no do N cujos campos chave e prox so
respectivamente configurados com o valor
de x e . O novo no do ento conectado ao
final da fila (linha-4) e Q.f atualizado para
o novo ltimo no do (linha-5). O comprimento da fila aumentado em uma unidade na linha-6. Note que como a estrutura encadeada ento no existem testes
de verificao no algoritmo.
No Algoritmo-9 implementado o operador D EQUEUE de desenfileiramento em uma
fila encadeada Q passada como argumento.
Este operador testa se Q no est vazia
5

Profo . Ricardo Reis

Algoritmos, Filas
Algoritmo 8 Enfileiramento em fila encadeada
1:
2:
3:
4:
5:
6:

Algoritmo 10 Demais operadores em filas encadeadas

Funo E NQUEUE(ref Q, x)
N .chave x
N .prox
Q.f.prox N
Q.f N
Q.t Q.t + 1

(linha-2) e em caso de xito elimina o primeiro no do da lista base. A eliminao


possui as trs etapas j conhecidas: (i) reserva do primeiro no do atravs de uma
varivel auxiliar (linha-3); (ii) deslocamento
da raiz Q.i para a posio adiante (linha-4);
(iii) eliminao do no do reservado (linha5). Na linha-6 o comprimento da fila corrigido. A linha-7 e a linha-9 so dedicadas a retorno de funo: Verdadeiro indica que houve desenfileiramento e Falso
que a fila estava vazia e nenhum desenfileiramento pde ser efetuado.

Funo B EGIN(Q)
Retorne Q.i.chave

3:
4:

Funo E ND(Q)
Retorne Q.f.chave

5:
6:

Funo E MPTY(Q)
Retorne Q.t = 0

5
5.1

Aplicaes de Filas
Bucketsort

Um algoritmo Bucketsort uma categoria


de algoritmos de ordenao que se baseia
na diviso das chaves de um vetor U , a ser
ordenado, em Buckets (baldes). Consistem
em etapas, chamadas distribuies, onde as
chaves de U so divididas entre os buckets,
seguindo algum critrio, e em seguida recolhidas dos buckets e levadas de volta para
U cujo novo leiaute se mostra mais ordenado que o anterior. Aps uma dada quantidade de distribuies o vetor U se torna
ordenado.
Radixsort, ou ordenao por raiz, um
algoritmo da categoria bucketsort de complexidade linear, ou seja, O(n), comumente
utilizado para ordenar nmeros inteiros podendo ser expandido para outras formas de
dados. Na ordenao por raiz de nmeros
inteiros, em base decimal, cada distribuio efetuada de acordo com uma famlia
de dgitos das chaves, ou seja, a primeira
distribuio ocorre de acordo com a unidade das chaves, a segunda de acordo com
as dezenas, a terceira de acordo com as
centenas e assim sucessivamente. A quantidade de buckets necessria deve ser dez
(referente a cada dgito na base decimal) e o
total de distribuies deve ser igual a quantidade de dgitos do maior inteiro (em mdulo) de U .
A ordenao por raiz de um vetor U de
n nmeros inteiros em base decimal utiliza
dez filas que funcionam como buckets e so
rotuladas de 0 a 9 que anunciam seus dgi-

Algoritmo 9 Desenfileiramento em fila encadeada


1:
2:
3:
4:
5:
6:
7:
8:
9:

1:
2:

Funo D EQUEUE(ref Q)
Se Q.t > 0 ento
N Q.i
Q.i Q.i.prox
Desalocar N
Q.t Q.t 1
Retorne Verdadeiro
seno
Retorne Falso

Os demais operadores de filas encadeadas so implementados no Algoritmo-10.


B EGIN e E ND retornam respectivamente as
chaves do primeiro e ltimo nodos da fila
Q (argumento de entrada) lendo o campo
chave dos nodos apontados pelos campos i
e f . E MPTY testa se a a fila de entrada Q
est vazia apenas verificando se o campo t
nulo.
6

Profo . Ricardo Reis

Algoritmos, Filas

Figura 4: Distribuies efetuadas em uma ordenao por raiz (BucketSort/RadixSort)

tos de controle na base decimal. Em cada


distribuio as chaves de U so levadas aos
buckets cujos dgitos atuais (unidade, dezena, centena e etc) eles rotulam. Depois
que as chaves so enfileiradas nos buckets,
elas so desenfileiradas e levadas de volta
a U . Os desenfileiramentos ocorrem em ordem crescente de rtulos dos buckets e, em
cada bucket, procedem continuamente at
esvaziamento. O repovoamento de U ocorre
sequencialmente, desde a primeira posio,
e avana conforme as chaves so desenfileiradas dos buckets e reinseridas em U . O
nmero de distribuies efetuadas igual

ao nmero mximo d de dgitos que ocorre


entre as chaves de U .
A Figura-4 ilustra as distribuies executadas num dado vetor cujas chaves (inteiros) possuem at quatro dgitos (por isso
ocorre um total de quatro distribuies).
Em cada distribuio mostrado o leiaute
de buckets (filas) aps a transparncia de
chaves do vetor (enfileiramento por cima
e desenfileiramento por baixo) e o leiaute
do vetor aps esvaziamento dos buckets.
Os rtulos numricos em marca dgua em
cada bucket indicam a que dgito na base
decimal ele se refere. Os dgitos de controle
7

Profo . Ricardo Reis

Algoritmos, Filas
Algoritmo 11 Ordenao por Raiz (RadixSort)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

Funo R ADIX S OR T(ref L, n, d)


Para i 1..10 faa
buckets[i] C REATE()
m1
Para i 1..d faa
Para j 1..n faa
dig bL[j]/mc mod 10
E NQUEUE(buckets[dig + 1], L[j])
k1
Para i 1..10 faa
Enquanto no E MPTY(buckets[i]) faa
L[k] B EGIN(buckets[i])
D EQUEUE(buckets[i])
k k+1
m m 10

de cada distribuio so envolvidos por retngulos.


O Algoritmo-11 mostra a implementao da ordenao por raiz. A funo R A DIX S OR T ordena o vetor L (primeiro argumento) de comprimento n (segundo argumento) e cujas chaves possuem no mximo
d dgitos (terceiro argumento). Na primeira
parte (linha-2 a linha-3) construdo o vetor buckets constitudo de dez filas que funcionam como buckets (os ndices esto entre 1 e 10, mas se referem respectivamente
aos dgitos de 0 a 9).
O lao da linha-5 refere-se ao controle
das distribuies e efetua d iteraes. Para
cada uma destas iteraes o lao da linha-6
enfileira as chaves de L nos buckets. Tais
enfileiramentos ocorrem de acordo com a
famlia de dgitos das chaves (unidade, dezena, centena e etc) da distribuio em progresso. Os dgitos mapeiam os buckets de
destino correspondentes.
O k-simo dgito de um inteiro x (medido
de trs para frente) dada por,
j x k
mod 10
(1)
digk (x)
10k1
Na linha-7 o dgito de controle da distribuio corrente determinado por uma
reformulao da Equao-1 que substitui
10k1 pela varivel m. A ideia usar a estrutura do prprio lao e fazer m (que inicia

Cria dez filas vazias para representar os buckets

Controlador de dgitos de referncia

.
.

Lao das distribuies

Povoamento de buckets da distribuio corrente

.
.

Enfileiramentos

Esvaziamento de buckets com repovoamento de L

Desenfileiramentos

com valor 1, linha-4), em cada iterao, ser


multiplicado por 10 (linha-15). O efeito
equivalente a potncia de dez da Equao1, porm computacionalmente menos dispendioso. Note ainda que, como os valores de dgitos calculados ficam na faixa 0..9,
o mapeamento do bucket correspondente
feito pela expresso dig + 1 (linha-8).
Os enfileiramentos ocorrem na linha-8 e
os desenfileiramentos na linha-13 os quais
esvaziam os buckets e repovoam L. No repovoamento de L cada chave desenfileirada
dos buckets copiada para L na posio k
(inicialmente k vale 1, linha-9). O valor de
k incrementado e cada iterao na linha14.

5.2

Preenchimento em Imagens

Uma imagem I uma matriz m n de clulas denominadas pxels, que armazenam,


cada uma, um valor de cor normalmente
representado por um ou mais nmeros inteiros. Diz-se que I possui resoluo m n
com m linhas e n colunas. A posio de um
pixel dada pelo par formado por sua linha
e sua coluna. Valores de linhas esto no
intervalo 1..m e de coluna no intervalo 1..n.
O pixel mais superior e mais esquerda de
uma imagem possui posio (1, 1) e o pixel
mais inferior e mais direita possui posio
8

Profo . Ricardo Reis

Algoritmos, Filas

5. Promover o desenfileiramento sequencial de Q at seu esvaziamento e para


cada posio {p, q} desenfileirada devese,
(a) Colorir em CINZA e depois enfileirar em Q todas as posies vizinhas cardeais {p, q} cujas cores sejam a mesma da cor de referncia (note que isso descarta
os pxels que formam o contorno).
As posies vizinhas cardeais correspondem quelas diretamente ao
norte ({p 1, q}), ao sul ({p + 1, q}),
oeste ({p, q 1}) e leste ({p, q + 1})
conforme esquema ilustrativo,

Figura 5: Imagem com regio limitada por uma


linha fechada.

(m, n).
Consideremos o problema de preenchimento de uma regio fechada em uma imagem I, ou seja, dada uma imagem contendo uma disposio de pxels de mesma
cor que formam uma linha de contorno
fechada cujo interior deseja-se preencher
(com a mesma cor do contorno).
Seja uma imagem I dada de resoluo
10 10 cujos pxels podem assumir trs cores: branco, cinza e preto. Inicialmente I
uma regio branca contendo um contorno
preto fechado como ilustrado na Figura5. Deseja-se preencher em preto a regio
branca limitada pelo contorno preto. A
ideia partir de um pixel interno ao contorno (branco) e efetuar um preenchimento
que pinta gradativamente as vizinhanas e
se expande at que o contorno seja encontrado (veja Figura-6).
As etapas de um algoritmo de preenchimento so descritas a seguir,

p 1, q

p, q 1

p, q

p, q + 1

p + 1, q

(b) Colorir a posio {p, q} em PRETO.


Note que, no algoritmo anterior, antes
mesmo de assumir PRETO, os pxels, inicialmente em BRANCO, so pintados de CINZA.
Isso ocorre no dado instante em que suas
posies devem ser enfileiradas em Q. Somente quando todos os pxels em posies vizinhas cardeais so resolvidos (enfileirados ou descartados por pertencerem
ao contorno) que ento so pintados de
preto. Isso cria um efeito como o mostrado
pela Figura-6 o qual ilustra uma frente
cinza que avana em direo ao contorno
e cujos pxels possuem suas posies enfileiradas espera de serem resolvidas (pintadas de PRETO).
O Algoritmo-12 implementa o algoritmo
descrito anteriormente. Como argumentos
so repassadas uma imagem I e a posio
{lin, col} a partir da qual se desenvolver o
preenchimento. Na linha-2 criada a fila
de posies, Q. Na linha-3 determinada a
cor de referncia, cor. Na linha-4 enfileirada a posio {lin, col}. O lao da linha-5
o responsvel pelo esvaziamento de Q. Na

1. Tomar a posio col, lin do ponto Q a


partir do qual se desenvolver o preenchimento.
2. Tomar a cor de Q (em nosso exemplo
necessariamente BRANCO) como cor de
referncia, ou seja, todos os pxels de
mesma cor nas vizinhanas devero ser
pintados de PRETO.
3. Criar uma fila de posies, Q.
4. Colorir a posio {lin, col} em CINZA e
depois enfileir-la em Q.
9

Profo . Ricardo Reis

Algoritmos, Filas

Figura 6: Preenchimento em uma figura de uma regio limitada

Algoritmo 12 Preenchimento de regio in-

linha-6 e na linha-7 ocorre um desenfileiramento que armazenado na posio {p, q}.


Na linha-9 criado o vetor V das quatro
posies vizinhas cardeais a {p, q} que so
candidatas a serem enfileiradas. O lao da
linha-10 varre V e tenta fazer os enfileiramentos. Na linha-11 as variveis i e j so
utilizadas para recuperar cada uma das posies vizinhas cardeais de V . O teste da
linha-12 testa se de fato a cor da posio
vizinha cardeal vigente possui a cor de referncia, cor (quando este teste falha porque um pixel do contorno foi encontrado).
As posies que passam no teste anterior
so coloridas em CINZA (linha-13) e enfileiradas em Q (linha-14). As posies cujas
vizinhanas j esto resolvidas so pintadas de PRETO conforme linha-15.

terna a um contorno em uma figura

Funo F LOOD F ILL(ref I, lin, col)


Q C REATE()
cor I[lin, col]
E NQUEUE(Q, {lin, col})
Enquanto no E MPTY(Q) faa
p, q B EGIN(Q)
D EQUEUE(Q)
V [(p 1, q), (p + 1, q),
(p, q 1), (p, q + 1)]
Para k 1..4 faa
i, j V [k]
Se I[i, j] = cor ento
I[i, j] CINZA
E NQUEUE(Q, V [k])
15:
I[p, q] PRETO

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

2. 435, 803, 826, 587, 338, 138, 984, 470,


905, 642, 731, 729

Exerccios

3. 7794, 8039, 8040, 8870, 7426, 661, 3812,


6649, 5447, 7341, 1991, 2457

Ilustrar todas as distribuies na ordenao por


raiz dos vetores a seguir,

Uma deque uma fila especial que permite enfileiramento e desenfileiramento em ambas extremidades. Uma deque sequencial usa de base um

1. 259, 385, 718, 557, 548, 855, 895, 974,


725, 282, 470, 872

10

Profo . Ricardo Reis

Algoritmos, Filas

14. Modifique o algoritmo de preenchimento


em imagens de forma a aceitar contornos
abertos. O que muda neste caso?

vetor alocado dinamicamente cujo comprimento


invariante durante a existncia da fila. Implementar,

15. O que muda no algoritmo de preenchimento no caso de figuras com muitas cores? O contorno pode ser composto por
mais de uma cor? A fila precisa de mais
alguma condio de enfileiramento?

4. Descritor de uma deque sequencial.


5. Construtor e destrutor de uma deque sequencial.
6. Operadores P USH F RONT e P USH B ACK de
respectivos enfileiramentos no incio e final
de uma deque sequencial.

16. Seja I uma imagem de resoluo n n.


Qual a ordem de comprimento mxima a
que pode chegar uma fila utilizada no preenchimento de I?

7. Operadores P OP F RONT e P OP B ACK de respectivos desenfileiramentos no incio e final


de uma deque sequencial.

17. Se, no Algoritmo-12, ao invs dos quatro


pxels cardeais fossem utilizados os oito pxels de vizinhana o que mudaria? Seia
vantajoso ou desvantajoso?

8. Implemente uma deque que utilize uma


lista encadeada como estrutura de base
(note que esta lista precisa ser duplamente
encadeada).

18. Seja I uma imagem em escala cinza, ou


seja, os pxels podem assumir apenas tonalidades de cinza. Em geral um tom de
cinza pode ser representado por um nmero de ponto flutuante entre zero e um
onde zero preto e um branco. Suponhamos que I contenha um fundo branco
e uma regio A fechada contornada por
uma linha preta. Um preenchimento em
degrad de A, a partir de um pixel P pertencente a A, corresponde a um processo
de colorao dos pxels de A onde P mantido branco e os demais pxels pintados em
tons de cinza em valores decrescentes de
tons desde P (onde vale um) at um pxel do
contorno (onde vale zero). Proponha e implemente um algoritmo de preenchimento
em degrad.

Resolva os problemas seguintes relacionados a


BucketSort,
9. Como se pode modificar o RadixSort de
forma que nmeros inteiros negativos possam tambm estar presentes? Porque na
verso do Algoritmo-11 isso no era possvel?
10. Modifique o Algoritmo-11 de forma que se
aplique a ordenao de strings.
11. Proponha um algoritmo de ordenao BucketSort para ordenao de nmeros de
ponto flutuante.
12. Construa uma variao do Algoritmo-11
para ordenao de nmeros inteiros positivos utilizando suas representaes binrias (note que isso implica utilizao de
apenas dois buckets).

Resolva os seguintes problemas,


19. Construa a partir de duas pilhas uma estrutura que se comporte como uma fila. O
que se pode afirmar em relao ao desempenho dessa nova estrutura?

13. Ao ordenar-se inteiros de 32 bits pelo algoritmo da questo-12 devem ser realizadas
32 distribuies. Na prtica isso um desperdcio pois em muitos casos o maior inteiro (em bits) de um vetor precisa bem menos que 32 bits. Proponha um teste a ser
feito no final de uma distribuio que determine se a distribuio seguinte precisa
ou no ser executada. Qual a complexidade deste teste?

20. Um operador de transparncia em uma fila


Q, um operador que permite acessar (somente leitura) quaisquer umas das chaves
de Q. A ideia repassar um ndice virtual,
j, entre 1 e Q.t, e mapear chaves entre o incio e final da fila (note que quando j = 1 a
posio real Q.i e quando j = Q.t ento a
posio real Q.f ). Implemente um operador
de transparncia para um fila.

Resolva os problemas a seguir referentes ao algoritmo de preenchimento em imagens,

11

Profo . Ricardo Reis

Algoritmos, Filas

21. Utilize os operadores tradicionais de filas


e mais o operador de transparncia (questo 20) para resolver o seguinte problema:
Dado um vetor L de inteiros de comprimento n e um inteiro m, tal que m < n,
determinar a subsequencia de L de comprimento m cuja soma seja mxima.

12

Vous aimerez peut-être aussi