Texte du Devoir

publicité
Année Universitaire 2016/2017
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.
Conditions du devoir
Les devoirs sont impérativement effectués en binôme (si le nombre total d’étudiants est impair, l’un d’eux – et un
seul – pourra être seul, mais il n’y aura pas de groupe de trois). Il est formellement interdit copier des « bouts de
code » sur Internet ou sur ce qu’ont fait d’autres étudiants.
Le travail à remettre sera constitué d’un rapport et d’un programme :
-
-
Le rapport sera en format pdf, d’une taille de deux à quatre pages, et il donnera des indications sur la
structuration du programme, les raisons des choix effectués, les difficultés rencontrées, éventuellement des
résultats (mais pas une description de l’algorithme ni des « bouts de code »).
Le programme sera dans un langage de programmation au choix mais après agrément du professeur (C,
C++, Java, Python ont été les langages choisis) ; il y aura a priori un seul fichier pour le programme mais s’il
y en a deux ou trois (pas plus), ce n’est pas gênant.
Tous ces documents doivent m’être adressés par mail (adresse e-mail : [email protected]) au plus tard le
mercredi 19 octobre à midi. Le mail doit m’être envoyé par l’un des deux étudiants du binôme et l’autre étudiant
doit être en copie du message. Les fichiers (rapport, programmes) doivent apparaître comme autant de pièces
jointes : il ne doit absolument pas y avoir de dossier compressé en document attaché. Dans tous les cas, je vous
renverrai un message (rapidement) pour vous dire que j’ai bien reçu vos documents. Si vous n’avez pas reçu cet
accusé de réception de la part, c’est que votre mail ne m’est pas parvenu … vérifiez donc bien à avoir reçu cet
accusé de réception.
Pour éviter tout problème, je vous conseille de me faire parvenir ces documents mardi soir ou mercredi en tout début
de matinée.
Le lendemain, jeudi 20 octobre, de 15h à 17h aura lieu la présentation des devoirs :
-
Ne seront autorisés à présenter leur devoir que ceux qui m’auront adressé leurs documents dans les
conditions énoncées précédemment
Chaque binôme disposera de 5mn (pas plus) : pensez donc à me montrer ce qui est pertinent, …
Téléchargement