Licence d’Informatique (L3)
SIN5U1TL – Algorithmique avancée
Devoir n°1 – Les Skiplists
Description rapide des Skiplists
Les Skiplists ont été inventées par William Pugh en 1990 et sont décrites dans l’article que vous pouvez télécharger
au lien suivant :
!
http://epaperpress.com/sortsearch/download/skiplist.pdf
Cette structure de données constitue une alternative aux arbres équilibrés – et autres structures permettant
d’accéder rapidement aux données, mais aussi de les modifier « de manière individuelle » tout aussi rapidement.
L’idée de base est de partir de la structure de liste et de l’améliorer pour offrir la possibilité d’atteindre rapidement
une cellule donnée au sein de cette liste, ou de trouver l’emplacement auquel il faudra insérer une nouvelle cellule.
Chaque cellule est constituée d’une clé (ou pointeur vers une structure contenant cette clé) et d’une « tour » de
pointeurs. Cette tour contient au moins un élément qui permet de relier cette cellule à la prochaine cellule (si toutes
les tours étaient réduites à ce simple élément, il s’agirait alors d’une liste chaînée), mais en contient généralement
plus : chaque pointeur permet de « sauter » plus loin dans la liste, et ce saut est d’autant plus grand que le pointeur
est plus haut dans la tour. Idéalement, il faudrait avoir une tour de hauteur log2(n) au milieu (hauteur maximale),
deux tours de hauteur log2(n)-1 au quart et aux trois quarts de la liste, etc. Cela peut être mis en place ainsi à
l’initialisation mais sera nécessairement modifié lors de l’insertion et de la suppression d’éléments dans la Skiplist.
Pour maintenir au mieux cette disposition, on insérera un nouvel élément avec une tour de hauteur aléatoire, dont la
probabilité aura une distribution analogue à celle évoquée à la fin du paragraphe précédent (quelque part, on
remplace la probabilité « spatiale » – i.e. en position – par une probabilité locale – i.e. de hauteur de tour). Tous les
détails concernant cette « création » d’une tour de pointeur sont détaillés dans l’article de William Pugh, avec le cas
d’une probabilité ½ (comme évoqué avant) mais aussi d’une probabilité p quelconque.
Au final, il existe une probabilité non nulle de retrouver une simple liste chaînée, mais cette probabilité est très faible.
Travail demandé
!On demande de mettre en place la structure de données adéquate (en pensant à tous les éléments qui seront
nécessaires à la mise en œuvre de l’algorithme) et de programmer les opérations de recherche, d’insertion et de
suppression d’un élément.
On remplira la Skiplist en utilisant un générateur de nombres aléatoires compris entre 0 et N (N grand) et en ne
validant l’insertion qu’après avoir effectué une recherche du nouvel élément dans la Skiplist ; si celui-ci est déjà
présent, on ne l’insère pas à nouveau (la Skiplist ne contiendra donc que des nombres différents).
Lors du remplissage de la Skiplist, on mémorisera par ailleurs (dans un tableau, de manière non triée, naturellement)
les nombres se trouvant dans celle-ci. On pourra alors procéder à la suppression aléatoire des éléments de la
Skiplist (en les désignant aléatoirement dans ce tableau).
Il n’est pas simple de visualiser une Skiplist (surtout s’il y a de nombreux éléments) mais on peut étudier la
distribution des intervalles entre les sauts d’un niveau (de tour) donné : on demande de visualiser la distribution de
ces sauts en fonction du niveau (de manière à voir comment se comportent effectivement les Skiplists). Toute liberté
est laissée pour cela, à condition que la visualisation permette à l’utilisateur d’appréhender ce qui se passe.