Você está na página 1de 9

Universidade Federal de Minas Gerais

Algoritmos e Estruturas de Dados II

Instituto de Cincias Exatas

2o Semestre de 2013

Departamento de Cincia da Computao

Trabalho Prtico 1 Skip List Estruturas de Dados


Valor: 15 pontos
Data de entrega no PRATICO (aeds.dcc.ufmg.br): 14/10/2013

Uma lista encadeada ou lista ligada uma estrutura de dados composta por um conjunto de
clulas onde cada clula aponta para a seguinte. Embora seja uma estrutura de dados relativamente
simples, a lista encadeada ordenada apresenta custos relativamente altos para insero, busca e
remoo. Esse custo ocorre porque, para insero ou remoo de uma clula, preciso fazer uma busca
prvia. A Figura 1 ilustra uma lista encadeada ordenada.

Figura 1: Lista encadeada ordenada

A Skip List uma estrutura de dados voltada para chaves ordenadas cujo custo de insero,
remoo e busca bem menor que na lista encadeada ordenada tradicional. Uma Skip List
implementada como um conjunto de listas encadeadas hierrquicas. Deste modo, a referida estrutura
construda em camadas. A lista mais ao fundo (h = 0) uma lista encadeada ordenada tradicional,
enquanto que cada lista na camada superior (h + k) contm uma cpia parcial da lista na camada
inferior (h + k-1).
A quantidade de elementos das listas parciais pode variar, mas para o presente trabalho, a
quantidade de elementos da lista superior ser aproximadamente, metade da lista inferior. A Fig. 2
ilustra a estrutura bsica de uma Skip List.

Figura 2: Estrutura de uma Skip List.

Note que o nvel hierrquico 0 equivalente a lista encadeada tradicional mostrada na Fig. 1,
enquanto que as demais listas nos nveis hierrquicos superiores (h > 0) apresentam uma cpia parcial
da sua respectiva lista mais inferior.
Objetivo Geral: o objetivo geral do Trabalho Prtico 1 a implementao de uma estrutura de
dados Skip List.
Objetivos Especficos: a estrutura de dados dever contemplar as funes FLVazia, Vazia,

Insere, Remove, Busca, Imprime e ImprimeTodos conforme especificado nesse texto.


Os critrios a serem adotados na estrutura Skip List deste trabalho so:

Os nveis hierrquicos sero numerados de baixo para cima comeando por 0, vide Fig.
2.
No presente trabalho, ser fixado o nmero mximo de 5 nveis hierrquicos (m=5), ou
seja, 0h4 .
A lista superior (h + 1) deve ter aproximadamente metade dos elementos da lista
inferior. Ou seja, q h+1q h /2 , onde q h representa a quantidade de clulas no nvel
hierrquico h. Os elementos da lista (h + 1) so selecionados aleatoriamente, contudo,
para padronizao das sadas no presente trabalho, a hierarquia ser fornecida
juntamente com a chave.

No TAD voc deve criar um tipo (typedef) para representar a clula contendo sua chave e os
demais atributos e ponteiros que se julgue necessrio para a implementao do TAD Skip List.
Tambm devem ser implementadas as funes do TAD Skip List conforme lista abaixo:
void FLVazia(TipoLista *Lista);
A funo FLVazia inicia a lista criando sua estrutura bsica de funcionamento. Considerando
a implementao com n cabea, a iniciao criar uma estrutura similar ilustrada na Figura 3.

Figura 3: Estrutura de iniciao com n cabea para Skip List.

importante destacar que no presente trabalho, sua estrutura ter 5 nveis, ou seja, um nvel a
mais que o ilustrado na Fig. 3.
int Vazia(TipoLista Lista);
Verifica se a lista est vazia, retornando 0, ou se contm algum elemento, retornando 1. A lista
est vazia quando todos os ponteiros de prximo elemento da cabea apontam para NIL como
mostrado na Fig. 3.
int Busca(TipoChave chave, TipoLista *L, Apontador *ListaH, int
imprimir);
A busca ser feita pela chave passada por parmetro, retornando 1 caso o elemento seja
encontrado e 0 caso contrrio.
Em caso de sucesso, uma lista de ponteiros (ListaH) contendo o ponteiro de cada nvel deve

ser retornado. Cada ponteiro do nvel h (ListaH[h]), deve apontar para o elemento chave buscado,
ou o primeiro elemento maior que a chave caso a mesma no exista em determinado nvel, ou ainda
NIL caso no haja elemento maior que a chave em determinado nvel. Ou seja, ListaH[h] guarda o
ponteiro anterior ao elemento chave buscado ou a sua posio de possvel insero caso ele no exista.
A funo busca uma das mais importantes neste TP, pois, tambm serve como base para as
funes insere e remove. No caso da insero, a funo busca fornece os ponteiros das clulas
anteriores em cada nvel hierrquico posio de insero de uma nova clula. No caso da remoo, a
funo fornece os ponteiros em cada nvel que apontam para a clula a ser excluda. Lembre-se de que
lista de ponteiros obtida pela funo Busca atravs do parmetro ListaH.
Algoritmo da funo de busca.
A funo de busca, comea pesquisando o elemento chave na lista mais superior. Se o prximo
elemento for NIL ou a chave for maior que o elemento de busca, ento preciso descer um nvel e
continuar a busca horizontalmente at o prximo decremento de nvel. A cada descida, o ponteiro para
o prximo elemento deve ser guardado em ListaH[h]. A seguir apresentado o pseudo algoritmo
para busca bem como um exemplo ilustrado na Fig. 4.
int Busca(TipoChave chave, TipoLista *L, Apontador *ListaH, int imprimir){
x = lista->primeiro; // primeiro elemento (cabea ou head)
// neste exemplo, max_hierarquia = 3
para h = max_hierarquia decremente Ate 0 faa{
enquanto ((x->prox[h].chave < chave) && (x->prox[h] != NIL)){
x = x->prox[h];
}
ListaH[h] = x->prox[h];
}
se ( x->prox[h].chave == chave) ento
retorne 1;
senao
retorne 0;
}

OBS.: O pseudo algoritmo acima deve ser convertido para linguagem C de acordo com seu TAD. Este
pseudo algoritmo no mostra os detalhes de declarao de variveis nem outros passos considerados
triviais.
Para ilustrar a funo busca, considere localizar a chave 17. Os passos da busca so ilustrados
na Fig. 4 seguindo o caminho tracejado em azul.

Figura 4: Busca da chave 17.

Neste exemplo (Fig. 4), ListaH deve retornar os seguintes ponteiros (na orderm do nvel
hierrquico de 0 ao 3): {A, B, C, D}.
Caso o pamametro imprimir da busca seja igual a 1, a funo tambm deve imprimir no
arquivo de sada as chaves e os seus respectivos nveis hierrquicos visitados, sendo uma linha para
cada par chave/hierarquia (c h) visitada. Para a busca da chave 17, ilustrada na Fig. 4, a sada
apresentada dever ser:
6 3
6 2
9 1
12 0
17 0
Nota: A funo de busca dever imprimir os elementos apenas quando a busca for a funo principal.
Quando for uma funo auxiliar como em inserir e remover, a busca no dever imprimir o caminho
percorrido.
int Insere(TipoItem x, int h, TipoLista *Lista);
Esta funo deve inserir um novo elemento na estrutura do Skip List mantendo a consistncia da
lista. A insero com sucesso deve retornar 1, ou 0 caso contrrio. Obviamente, o elemento chave no
pode ser duplicado, retornando 0 na funo insere.
Cada insero dever imprimir no arquivo de sada se a operao teve sucesso ou no, sendo,
true para sucesso e false caso contrrio.
O primeiro passo antes da insero a busca da chave a ser inserida, o que ir retornar a posio
em que o elemento dever ser inserido, caso a chave de fato no exista. Estas posies representadas
pelos ponteiros de cada lista so obtidas em ListaH.
Para a insero de um novo elemento na lista, ser fornecida tanto a sua chave quanto a sua
hierarquia (c h).
OBS.: Na busca feita para a funo insere, o caminho da busca no ser impresso, ou seja, o
parmetro imprimir da funo de busca ser igual a 0.
Importante: a hierarquia definida no par de insero (c h) implica na insero da chave c na
hierarquia h e em todas as suas listas hierarquias inferiores, at a lista 0. Por exemplo, a insero da
chave 6 na hierarquia 3, implica na insero da chave em todas as listas como mostrado na Fig. 2.
A insero de alguns elementos ilustrada a seguir. Considere o par chave/hierarquia (c h).

a) Insero da chave 12 na hierarquia de nvel 0 (12 0). A busca do elemento 12 retorna


false e todos os elementos anteriores em ListaH apontam para NIL. A insero feita apenas no
nvel 0.

Figura 5: Insero da chave 12 na lista hierrquica 0.

b) Insero da chave 9 na hierarquia de nvel 1 e 0 (9 1). Na insero de (9 1), a busca pela


chave 9 retorna false e ListaH[0] aponta para 12 enquanto os demais elementos de ListaH
apontam para NIL (Fig. 5).

Figura 6: Insero da chave 9 na lista hierrquica 1 e demais inferiores.

Aps a insero da chave 9, os ponteiros ficam configurados como mostrado na Fig. 6.


c) Insero da chave 26 na hierarquia 0 (26 0).

Figura 7: Insero da chave 9 na lista hierrquica 0.

A insero da chave 26 realizada apenas na hierarquia 0, sendo modificada apenas a lista no


nvel 0.
d) Insero da chave 25 na hierarquia 2 e demais hierarquias inferiores (25 2).

Figura 8: Insero da chave 25 na lista hierarquica 2 e demais hierarquia(s) inferior(es).

A insero da chave 25, comea pela hierarquia de nvel 2 afetando no s essa lista, mas
tambm as listas inferiores 1 e 0. preciso conhecer os ponteiros das clulas anteriores das trs ultimas
listas.
int Remove(TipoChave chave, TipoLista *L);
Esta funo deve remover o elemento indicado com a chave. A remoo deve previamente
fazer uma busca pelo elemento chave por dois motivos: (i) a busca confirma a existncia ou no do
elemento indicado pela chave e (ii) a busca fornece todos os ponteiros anteriores que apontam para o
elemento a ser excludo. A manuteno desses ponteiros deve ser feita para manter a consistncia da
lista.
A remoo de um elemento deve fazer cada ponteiro, que aponta para o elemento a ser retirado,
apontar para a clula apontada pelo elemento retirado em sua respectiva hierarquia, de forma similar ao
que feito para a remoo de um elemento numa lista encadeada comum.
A Fig. 9 ilustra a retirada do elemento de chave igual a 25. Cada ponteiro que aponta para a
clula 25 passar a apontar para o elemento apontado por 25 no seu respectivo nvel hierrquico. Por
exemplo, o ponteiro da clula 12 no nvel 0 passar a apontar para 26 enquanto que o ponteiro do
elemento 9 no nvel 1 passar a apontar para NIL, e assim sucessivamente. Na Fig. 9 os ponteiros
tracejados que apontam para 25 so redirecionados conforme os ponteiros em verde.
Finalmente, para concluir a funo remove, a alocao de memria da clula retirada deve ser
liberada.

Figura 9: Remoo da chave 25.

Neste exemplo, aps a retirada da clula de chave 25, a estrutura deve ser tal como
representada na Fig. 7.
Cada tentativa de retirada dever imprimir no arquivo de sada se a operao teve sucesso ou
no, sendo true para sucesso e false caso contrrio.
OBS.: Na busca feita para a funo remove, o caminho da busca no ser impresso, ou seja, o
parmetro imprimir da funo de busca ser igual a 0.
void Imprime(TipoLista Lista, int h);
Lista todos os elementos no nvel hierrquico h. Cada chave deve ser impressa em uma linha
separada contendo o par chave/hierarquia (c h).

void ImprimeTodos(TipoLista Lista);


Lista todos os elementos por nvel hierrquico. Primeiramente lista os elementos no nvel
hierrquico mais alto (4), em seguida no nvel inferior, e assim sucessivamente at o nvel mais inferior
(0). Cada chave deve ser impressa em uma linha separada contendo o par chave/hierarquia (c h).
Modelo de Entrada
Seu projeto dever aceitar um arquivo de entrada no formato de texto passando como parmetro um
arquivo de entrada precedido por -i e um arquivo de sada precedido por -o. Exemplo:
./skipList -i entrada.txt -o saida.txt
Os arquivos de entrada sero listas de chaves a serem inseridas ou removidas, podendo conter
comandos de impresso e busca. Cada linha tem um comando, caso o comando seja de insero,
remoo ou busca, o mesmo ser seguido da chave c. Os comandos so:

I c h para inserir a chave c na hierarquia h;


R c para remover a chave c;
B c para buscar a chave c;
P h para imprimir a lista na hierarquia h usando a funo Imprime;
A para imprimir todas as listas das hierarquias usando a funo ImprimeTodos.

Um exemplo de arquivo de entrada mostrado a seguir:


I
I
I
I
B
P
R
A

12 0
9 1
26 0
25 2
26
0
25

Modelo de sada
Cada sada dever ser escrita em uma nova linha. Em outras palavras, no admitido mais que uma
sada por linha. As possveis sadas so listadas a seguir:
true

Para operao executada com sucesso

false

Para operao executada com algum erro

c h

Chave e hierarquia

Use EXATAMENTE a sada conforme especificado para manter a conformidade com o PRATICO. A
sada referente a entrada mostrada nesse texto apresentada a seguir:
false
true
false
true
false
true
false
true
25 2
25 1
25 0
26 0
true
9 0
12 0
25 0
26 0
true
true
9 1
9 0
12 0
26 0
Note que o programa principal no poder acessar diretamente a estrutura interna do TAD. Se
necessrio, acrescente novas funes ao seu TAD detalhando-as na documentao do trabalho.
O programa criado no deve conter menus interativos ou paradas para entrada de
comandos (como o system (PAUSE) por exemplo). Ele deve apenas ler os arquivos de entrada,
processlos e gerar os arquivos de sada.
Os TPs sero corrigidos em um ambiente Linux. Portanto, o uso de bibliotecas do Windows est
PROIBIDO.
O que deve ser entregue:

Cdigo fonte do programa em C (todos os arquivos .c e .h), bem comentado.


Arquivo executvel.
Documentao do trabalho. Entre outras coisas, a documentao deve conter, sucintamente:
1. Introduo: descrio sucinta do problema a ser resolvido e viso geral sobre o
funcionamento do programa.
2. Implementao: descrio sobre a implementao do programa. Deve ser detalhada a
estrutura de dados utilizada (de preferncia com diagramas ilustrativos), o funcionamento
das principais funes e procedimentos utilizados, o formato de entrada e sada de dados,
compilador utilizado, bem como decises tomadas relativas aos casos e detalhes de

3.

4.
5.
6.

especificao que porventura estejam omissos no enunciado.


Estudo de Complexidade: estudo da complexidade do tempo de execuo das funes
implementadas e do programa como um todo (notao O), considerando conjuntos de
tamanho n. Tambm deve ser apresentado um estudo de complexidade terica para busca,
insero e remoo do skip list. Considere uma quantidade arbitrria de nveis hierrquicos,
tantos quantos forem necessrios, respeitando sempre a quantidade de elementos no nvel h
+ 1 igual a metade dos elementos no nvel h ( q h+1=q h /2 ). Consiere tambm que a
quantidade de nveis m dada por: m=log 2 ( q0 )+1 .
Testes: descrio dos testes realizados e listagem da sada (no edite os resultados).
Concluso: comentrios gerais sobre o trabalho e as principais dificuldades encontradas em
sua implementao.
Bibliografia: bibliografia utilizada para o desenvolvimento do trabalho, incluindo sites da
Internet se for o caso.

Obs: Um exemplo de documentao est disponvel no Moodle.


Comentrios Gerais:
1. Comece a fazer este trabalho logo, enquanto o problema est fresco na memria e o prazo
para terminlo est to longe quanto jamais poder estar.
2. Clareza, indentao e comentrios no programa tambm sero avaliados.
3. O trabalho individual.
4. A submisso ser feita pelo sistema online (http://aeds.dcc.ufmg.br).
5. Trabalhos copiados, comprados, doados, etc. sero penalizados conforme anunciado.
6. Na prova 2, uma das questes poder ser sobre a implementao do trabalho. A nota do
trabalho ser ponderada pela nota dessa questo.
7. Caso se julgue necessrio, poder ser marcada uma entrevista com o aluno para
apresentao do trabalho.
8. Penalizao por atraso: (2d 1) pontos, onde d o nmero de dias de atraso.

Você também pode gostar