ESTRUTURAS DEDADOS E
ALGORITMOS
SKIPLIST Adalberto Cajueiro
Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1
S
KIPL
ISTSurgiram como uma ideia probabilistica para árvores balanceadas
Tempo esperado das operações com alta probabilidade O(log(n))
Fácil de implementar e de entender
2
Communications of the ACM, June 1990, 33(6) 668-676.
3
Q
UESTIONAMENTOSP
ERTINENTESQuanto tempo leva no pior caso para pesquisar em uma lista ordenada?
O(n).
4
Q
UESTIONAMENTOSP
ERTINENTESQuanto tempo leva no pior caso para pesquisar em uma lista ordenada?
O(n).
Como podemos melhorar a pesquisa em listas encadeadas?
5
E
XEMPLOLinhas de ônibus podem implementar uma skip list
Linha local (para em todos os pontos)
Linha expressa (poucas paradas)
6
E
XEMPLOComo fazer para ir da estação 1 para a 5?
Linha azul na estação 1 e desce na 4
Depois pegar a linha vermelha e descer na 5
7
1 2 3 4 5 6
S
KIPL
IST(D
EFINICAO)
Skip list é uma estrutura de dados probabilística, baseada em listas encadeadas, com eficiência comparadaa das árvores binária de pesquisa
Basicamente uma skip list é uma variaçãode uma lista encadeada ordenada onde a cada nó são acrescentados vários ponteiros para elementos a frente, de modo que a pesquisa possa
rapidamente pular partes da lista (daí o nome)
Uma skip list tem a propriedade de manter seus itens ordenados
8
S
KIPL
ISTBalancear probabilisticamente um estrutura de dados é mais fácil que manter o balanceamento de forma explicita.
Para algumas aplicações, skip lists são mais naturais que árvore e levam a algoritmos mais simples e fáceis de implementar.
Performance melhorada por um fator constante em relacao a algoritmos de balanceamento
Skip lists são eficientes em uso de espaço.
9
E
XEMPLO10 Nós sentinelas
S
KIPL
ISTS(D
EFINICOES)
11 niveis
nós
forward links
nó cabeçalho nó vazio
-∞ ∞
S
KIPL
IST(D
EFINICOES)
Nível (altura) máximo
Maior altura que um nó pode ter em uma skip list
Nível (altura)
A altura da skip list é a altura do maior nó, ou seja, a quantidade de referências do nó com maior número de apontadores forward.
Probabilidade
Probabilidade é o valor usado no algoritmo para determinar aleatoriamente o nível (altura) de cada nó
E
XEMPLOUm nívelpossui determinado numeros de nós que é menor ou igual ao número de nós da camada adjacente inferior
Todos os níveis possuem nós ordenados.
altura
nível
No de nivel 4 No de nivel 3 No de
nivel 2 No de nivel 1
13
C
ARACTERÍSTICASS0possui todos os elementos além do -∞ e ∞
Todos os Sipossuem -∞ e ∞
onde cada Si ⊆ S0
14 S0
Sh
E
XEMPLOInicializacao de uma skip list com nivel maximo 7 e probabilidade de 0,5.
O HDR (header) guarda o inicio da lista (menor valor possivel).
O elemento NIL guarda a maior chave possivel da skip list. Ele fica no final da lista.
Todos os níveis terminam com NIL.
-∞ ∞
15
-
∞
∞
E
XEMPLOInsercao dos nós 9,7,5,3,6,14,8,12 com respectivas alturas (níveis) sendo 2,1,1,2,2,1,1,5
determinados aleatoriamente.
Os nós sao colocados em ordem crescente
16 Usando nível máximo como altura da skip list.
E
XEMPLOInsercao dos nós 9,7,5,3,6,14,8,12 com respectivas alturas (níveis) sendo 2,1,1,2,2,1,1,5
determinados aleatoriamente.
Os nós sao colocados em ordem crescente
17 Sem usar nível máximo como altura da skip list.
S
KIPL
ISTAltura de uma skip list
Não depende da distribuição das chaves
Espera-se que cada nível tenha 50% do anterior
Logo a altura esperada é h = log n
A randomizaçãoé quem vai dizer isso
I
MPLEMENTAÇÃOQue estruturas compõem uma skip list?
Como implementá-las?
19
I
MPLEMENTAÇÃOComo implementar as classes SkipNode e
SkipList?
20
I
MPLEMENTAÇÃOComo implementar as classes SkipNode e
SkipList?
21
public class SkipNode<V> { SkipNode<V>[] forward; int height;
int key; V satteliteData;
public SkipNode(int key, int height, V satelliteData){ this.key = key;
this.height = height;
this.satteliteData = satelliteData; this.forward = new SkipNode[height]; }
}
I
MPLEMENTAÇÃO(I
NTERFACE)
22
public interface SkipList<V> { public void insert(int key, V newValue); public void insert(int key, V newValue, int height); public void remove(int key);
public int height();
public SkipNode<V> search(int key); public int size();
public SkipNode<V>[] toArray(); }
I
MPLEMENTAÇÃO23
public class SkipListImpl<V> implements SkipList<V> { SkipNode<V> root;
SkipNode<V> NIL; int level; int maxLevel;
boolean useMaxLevelAsLevel; double probability; }
E
XERCÍCIOComo representar o nó NIL?
24
public class SkipNode<V> { SkipNode<V>[] forward; int height;
int key; V value; }
public class SkipListImpl<V> implements SkipList<V> {
…
int infinito = Integer.MAX_VALUE; NIL = new
E
XERCÍCIOComo criar uma skip list vazia?
25 public classSkipListImpl<V> {
...
booleanuseMaxLevelAsLevel; doubleprobability = 0.5;
public SkipList (int maxLevel, boolean maxLevelAsLevel){ if(maxLevelAsLevel){
this.level = maxLevel; } else{
this.level = 1; }
this.maxLevel = maxLevel;
root = new SkipNode<V>(menosInfinito,maxLevel,menosInfinito); NIL = new SkipNode<V>(infinito,maxLevel,infinito); connectRootAndNIL();
} }
public classSkipListImpl<V> { ...
booleanuseMaxLevelAsLevel;
doubleprobability = 0.5;
public SkipList (int maxLevel, boolean maxLevelAsLevel){ if(maxLevelAsLevel){
this.level = maxLevel; } else{
this.level = 1; }
this.maxLevel = maxLevel;
root = new SkipNode<V>(menosInfinito,maxLevel,menosInfinito); NIL = new SkipNode<V>(infinito,maxLevel,infinito);
connectRootAndNIL();
} }
E
XERCÍCIOComo criar uma skip list vazia?
26 void connectRootAndNIL(){
for i:0 level root.forward[i] = NIL; }
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Como pesquisar o nó 8?
27
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list? Como pesquisar o nó 8?
Comece atravessando os apontadores forward que nao levam a um elemento menor que o procurado.
Depois siga para o elemento menor e aplique o mesmo raciocinio ate descer ao nivel 1.
Depois é só seguir o apontador forward do nivel 1 do
ultimo nó visitado. 28
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Como pesquisar o nó 8?
29
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
31
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
32
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
33
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
34
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
35
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
x
S
KIPL
IST(P
ESQUISA)
Como seria o algoritmo da pesquisa?
37
S
KIPL
IST(P
ESQUISA)
Como seria o algoritmo da pesquisa?
pesquisa(list,key) x := list.root
for i := list.level downto 1 do while x.forward[i].key < key do
x := x.forward[i] x := x.forward[1]
if x.key = key then return x.value
else return “A chave não existe”
Para andar ate o ultimo no com mesma altura
38
S
KIPL
IST(I
NSERCAO)
Como funciona a insercao em uma skip list?
Como inserir o nó 10?
O nivel do nó vai ser gerado aleatoriamente
Precisa de uma funcao randomica
Vamor supor que foi nivel randomico gerado foi 1
39
S
KIPL
IST(I
NSERCAO)
Como funciona a insercao em uma skip list?
Como inserir o nó 10?
O nivel do nó vai ser gerado aleatoriamente
Precisa de uma funcao randomica
Vamor supor que foi nivel randomico gerado foi 1
40
S
KIPL
IST(I
NSERCAO)
Como funciona a insercao em uma skip list?
Como inserir o nó 10?
O nivel do nó vai ser gerado aleatoriamente
Precisa de uma funcao randomica
Supor p = 0,5; random <= p (cria); random > p (nao cria)
41
S
KIPL
IST(I
NSERCAO)
Como funciona a insercao em uma skip list?
Como inserir o nó 4 e 15?
Supor que random gera 0,0,1,0,0,0,1 nessa ordem
Qual o nivel do no 4?
Qual o nivel do no 15?
S
KIPL
IST(I
NSERCAO)
Como funciona a insercao em uma skip list?
Como inserir o nó 4 e 15?
Supor que random gera 0,0,1,0,0,0,1 nessa ordem
Qual o nivel do no 4? (3)
Qual o nivel do no 15? (4)
43
I
LUSTACAO GERAL44
S
KIPL
IST(I
NSERCAO)
Como seria o
algoritmo da insercao?
45
S
KIPL
IST(I
NSERCAO)
Como seria o
algoritmo da insercao?
Inserir(SkipList list, key, newValue)
SkipNode [] update = new SkipNode [1..list.maxLevel]; x := list.root
for i := list.level downto 1 do while x.forward[i].key < key do
x := x.forward[i] update[i] := x x := x.forward[1] if x.key = key
x.value := newValue else
int v := randomLevel() if v > list.level then
for i := list.level + 1 to v do update[i] := list.root list.level := v
x := makeNode(key, v, newValue) for i := 1 to v do
x.forward[i] := update[i].forward[i] update[i].forward[i] := x
Altera Ponteiros Pesquisa o local
Guarda Caminho
Caso o nível aumente e list nao seja o 1o header. Este algoritmo
insere ou atualiza os dados
46
I
LUSTACAO GERALfor i: 1..v updade[1]
updade[4] updade[3]
updade[2]
x
47
S
KIPL
IST(R
EMOCAO)
Como funciona a remocao em uma skip list?
Como remover o nó 9?
É só procurar pelo nó e guardar os nós a terem os apontadores forward a serem atualizados para os apontadores forward do nó removido.
S
KIPL
IST(R
EMOCAO)
Como funciona a remocao em uma skip list?
Como remover o nó 9?
É só procurar pelo nó e guardar os nós a terem os apontadores forward a serem atualizados para os apontadores forward do nó removido.
49
S
KIPL
IST(R
EMOCAO)
Como seria o
algoritmo da remoção?
Delete(SkipList list, key)
Node [] update = new Node[1..list.maxLevel]; x := list.root
for i := list.level downto 1 do while x.forward[i].key < key do
x := x.forward[i] update[i] := x x := x.forward[1] if x.key = key then
for i := 1 to list.level do
if update[i].forward[i] ≠ x then break update[i].forward[i] := x.forward[i]
while list.level > 1 and
list.root.forward[list.level] = NIL do list.level := list.level –1
Ajeita Altura Ajeita Ponteiros Pesquisa o local
Guarda Caminho
50
S
KIPL
IST(R
EMOCAO)
updade[2] updade[4]
updade[3] updade[1]
x
for i := 1 to list.level do
if update[i].forward[i] ≠ x then break update[i].forward[i] := x.forward[i]
while list.level > 1 and list.root.forward[list.level] = NIL do list.level := list.level –1
51
S
KIPL
ISTApplet
http://people.ksp.sk/%7Ekuko/bak/index.html http://www.sccnet.com.br/jackson/SkipList/SkipListA
pplet/Applet.html
52
S
KIPL
IST(A
NÁLISES)
O tempo de pesquisade uma skip list é proporcional a:
Pesquisa na Diagonal
O número de passos para baixo nos niveis (vezes) O número de pesquisas para frente
Por fatores probabilísticos tem grande chance
de serem O(log n)
A análise do método inserire removeré similar Em média, skip lists são mais rápidas do que
árvores AVL e outras árvores balanceadas de
pesquisa 53
S
KIPL
IST(A
NÁLISES)
Complexidade de espaço
Usando-se fatores probabilísticos, calcula-se que o espaço provavelmente usado por uma skip list com n itens é deO(n)
R
EFERÊNCIASSeção 7.5
1a edição
http://www.sable.mcgill.ca/~dbelan2/cs251/skip_li sts.html