Escolar Documentos
Profissional Documentos
Cultura Documentos
2o Semestre de 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.
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.
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,
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.
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.
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 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.
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).
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
false
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:
3.
4.
5.
6.