E
STRUTURASDED
ADOS EA
LGORITMOSS
KIPL
IST Adalberto CajueiroDepartamento de Sistemas e Computação Universidade Federal de Campina Grande 1
S
KIPL
IST Surgiram como uma ideia probabilistica para árvores balanceadas
Tempo esperado das operações com alta probabilidade O(log(n))
Communications of the ACM, June 1990, 33(6) 668-676.
3
Q
UESTIONAMENTOSP
ERTINENTES Quanto tempo leva no pior caso para pesquisar em uma lista ordenada?
Q
UESTIONAMENTOSP
ERTINENTES Quanto tempo leva no pior caso para pesquisar em uma lista ordenada?
O(n).
Como podemos melhorar a pesquisa em listas encadeadas?
5
E
XEMPLO Linhas de ônibus podem implementar uma skip list
Linha local (para em todos os pontos)
E
XEMPLO Como 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 comparada a das árvores binária de pesquisa
Basicamente uma skip list é uma variação de 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)
S
KIPL
IST Balancear 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
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
E
XEMPLO Um nível possui 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
CARACTERÍSTICAS
S0 possui todos os elementos além do -∞ e ∞
Todos os Si possuem -∞ e ∞
onde cada Si ⊆ S0
E
XEMPLO Inicializacao 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
XEMPLO Insercao 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
E
XEMPLO Insercao 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.
SKIP LIST
Altura 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
I
MPLEMENTAÇÃO Que estruturas compõem uma skip list?
Como implementá-las?
19
I
MPLEMENTAÇÃO Como implementar as classes SkipNode e
I
MPLEMENTAÇÃO Como 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)
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();
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ÍCIO Como representar o nó NIL?
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
SkipNode<V>(infinito,maxLevel,infinito);
E
XERCÍCIO Como criar uma skip list vazia?
25
publicclass SkipListImpl<V> { ...
boolean useMaxLevelAsLevel; double probability = 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(); }
}
publicclass SkipListImpl<V> { ...
boolean useMaxLevelAsLevel; double probability = 0.5;
public SkipList (int maxLevel, boolean maxLevelAsLevel){ if(maxLevelAsLevel){
this.level = maxLevel; } else{
E
XERCÍCIO Como criar uma skip list vazia?
void connectRootAndNIL(){ for i:0 level
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.
S
KIPL
IST(P
ESQUISA)
Como pesquisar em uma skip list?
Como pesquisar o nó 8?
29
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
31
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
33
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
35
SKIP LIST (PESQUISA)
Como pesquisar em uma skip list?
Pesquise as chaves 9,15,13,17.
SKIP LIST (PESQUISA)
Como seria o algoritmo da pesquisa?
37
SKIP LIST (PESQUISA)
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]
SKIP LIST (INSERCAO)
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
SKIP LIST (INSERCAO)
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
SKIP LIST (INSERCAO)
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
SKIP LIST (INSERCAO)
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?
SKIP LIST (INSERCAO)
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
SKIP LIST (INSERCAO)
Como seria o
algoritmo da insercao?
45
SKIP LIST (INSERCAO)
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()
Pesquisa o local
Guarda Caminho
Este algoritmo insere ou atualiza
ILUSTACAO GERAL
x
for i: 1..v
x.forward[i] = update[i].forward[i] update[i].forward[i] = x
updade[1] updade[4]
updade[3]
updade[2]
x
47
SKIP LIST (REMOCAO)
Como funciona a remocao em uma skip list?
Como remover o nó 9?
SKIP LIST (REMOCAO)
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
SKIP LIST (REMOCAO)
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
Pesquisa o local
SKIP LIST (REMOCAO)
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
IST Applet
http://people.ksp.sk/%7Ekuko/bak/index.html
S
KIPL
IST(A
NÁLISES)
O tempo de pesquisa de 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 inserir e 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
R
EFERÊNCIAS Seção 7.5
1a edição
http://www.sable.mcgill.ca/~dbelan2/cs251/skip_li sts.html