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.
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> |
Une implémentation opérationnelle en C++ est disponible ici : ../../Sources/skip_list.html
Quelques liens pour enrichir le propos.