Skip to content

crispim1411/skiplist

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SkipList

SkipList é uma estrutura descrita em 1989 por William Pugh que se baseia em balancear de forma probabilística atalhos de um item a outro com objetivo de alcançar complexidade O(log(n)), sendo assim um substituto para árvores AVL. O objetivo deste projeto é de implementar uma Skip List em Rust, e dada a complexidade de desenvolvimento devido o gerenciamento de memória, foi decidido a implementação de estruturas intermediárias.

Artigo: Skip Lists: A Probabilistic Alternative to Balanced Trees

Plano de desenvolvimento

Esse estudo teve o intuito de unir o aprofundamento de Rust e de estruturas de dados. O desenvolvimento foi separado em 3 níveis:

  1. Stack: Entender o processo de substituição de um item por outro na cabeça da pilha (link)
  2. Linked List: Inserir um item entre outros dois itens de uma lista simplesmente ligada (link)
  3. SkipList: Em inserir um item entre dois itens respeitando as referências de atalhos (link)

Complexidade temporal

Um nível

Iniciando em uma lista simples ordenada a complexidade temporal média de busca é O(n)

image

Dois níveis

Vamos então incluir acima uma lista com atalhos a cada dois itens.

image

A complexidade temporal pode ser calculada por:

equation

E para equation temos que

equation

equation

Generalização

Incluindo mais um nível a complexidade se torna equation

image

Para k níveis temos uma complexidade equation. O que aconteceria se tivessemos log(n) níveis? O resultado final, incrivelmente, é O(log(n))

Randomização da estrutura

Manter uma estrutura onde o nível acima é sempre a metade do nível anterior é muito custoso. Como solução temos a randomização dos níveis. Quando um novo nó é inserido na skiplist seu nível é randomizado, tendo uma probabilidade P de obter uma promoção de nível e probabilidade P^k de obter o nível máximo.

image

Implementação

Em estruturas de dados onde o objeto de dado guardado precisar ser alocado independentemente do objeto original foi escolhido a alocaçao em Heap via Box. Dessa forma é possível referenciar e derreferenciar sem muita verbosidade de código (nem lifetimes)

Resgate do item da memória

O objeto do topo é obtido via std::mem::take, no lugar é deixado valores default do tipo.

Percorrer estrutura

Chamada função que verifica se a estrutura está vazia e em seguida o primeiro item é dado como cursor para uma função recursiva.

A fazer alterações

  • SkipList

About

Implementação de uma Skip List em Rust

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages