Skip Lists

Une Skip List est une alternative intéressante à certaines structures arborescentes comme std::set ou std::map. Cette structure de données associative de type {clé,valeur} n'admet qu'une valeur par clé, conserve les valeurs en ordre croissant de clé, et offre plusieurs caractéristiques intéressantes sur le plan de la complexité algorithmique.

Merci à André Caron pour m'avoir recommandé d'en discuter ici.


Image tirée du Wiki sur le sujet : http://en.wikipedia.org/wiki/Skip_list

L'idée générale va comme suit :

Ceci fait d'une Skip List un hybride entre une liste simplement chaînée et une structure facilitant un parcours de complexité logarithmique.

Opérations clés

Les opérations clés d'une Skip List suivent. Une implémentation peut bien sûr offrir d'autres services, ou utiliser d'autres noms que ceux utilisés ici.

Nom (français) Nom (anglais) Sémantique Complexité typique Risques d'échec / d'exception Remarques
ajouter
insert

Ajouter un élément dans la Skip List. Retourne true seulement si cela a fonctionné

en moyenne, dans le pire cas

L'expression skip.insert(k,v) échouera si skip contient déjà un élément à la clé k

 
retirer
remove

Retirer un élément de la Skip List. Retournera true seulement si l'élément a été retiré

en moyenne, dans le pire cas

L'expression skip.remove(k) échouera si skip ne contient pas un élément à la clé k

 

est_vide
empty

Prédicat qui s'avère seulement si la Skip List est vide

 

Si le langage le supporte, sera typiquement const

Si le langage le supporte, sera typiquement noexcept

contient
retrieve

Retrouver un élément par sa clé, ou retourner une valeur particulière pour indiquer l'absence d'un tel élément

en moyenne, dans le pire cas

 

Si le langage le supporte, sera typiquement const

Plusieurs options sont possibles pour représenter la dualité là, pas là. En pratique, je privilégie un std::optional<T> ou un maybe<T>

Technique

Une implémentation opérationnelle en C++ est disponible ici : ../../Sources/skip_list.html

Lectures complémentaires

Quelques liens pour enrichir le propos.


Valid XHTML 1.0 Transitional

CSS Valide !