Vous êtes sur la page 1sur 6

DUT Informatique

Conception de structures de donnes e

Anne 2010/2011 e

- Partiel - Aucun document autoris - Calculatrices interdites - Dure : 2 heures e e NOM Prnom : e

3 pts

Exercice 1. Complexits e Remplir tableau avec les complexits dans le pire cas pour les 3 oprations : chercher un lment, e e ee insrer ou supprimer un lment, dans une structure contenant n lments. e ee ee Vous devez ensuite justier bri`vement ces complexits. e e Remarque 1 : un arbre plein est un arbre binaire de taille n = 2h 1 dont tous les tages sont e compl`tement remplis. e Remarque 2 : pour la table de hachage, on consid`re que les collisions sont gres grce ` des e ee a a listes dont la taille est constante par rapport ` n. a Opration e Chercher Insrer e Supprimer tableau tab. tri e DList arbre bin. arbre plein table de hachage

6 pts

Exercice 2. Type abstrait Rlist Le but de cet exercice est dimplanter le type abstrait Rlist en utilisant des tableaux dynamiques plutt que des maillons cha es ` laide de pointeurs. On dnit donc les types suivants o n a e qui seront utiliss tout au long de cet exercice. e typedef int Element; typedef struct { int lgMax; // taille max. int lg; // nb dlments dans la liste e e Element *tab; }Rlist;

1. Compltez les dnitions des 5 fonctions de manipulations des listes pour quelles fonctione e nent avec la dnition du type Rlist donne ci-dessus. Dans un premier temps, on xe la e e taille max du tableau ` 100 et si il ny a plus de place, la fonction cons provoque une erreur. a
/* renvoie une liste vide */ Rlist newEmptyRlist(void){

/* teste si la liste est vide (renvoie 1 si elle est vide, et 0 sinon) */ int isEmpty(Rlist l){

/* renvoie une liste dont le premier lment est e et la fin est nxt */ e e /* provoque une erreur sil ny a pas assez de mmoire pour rajouter e */ e Rlist cons(Element e, Rlist nxt){

/* renvoie le premier lment de la liste l, si celle-ci nest pas vide */ e e /* provoque une erreur si la liste est vide. */ Element car(Rlist l){

/* renvoie la fin de la liste l, si celle-ci nest pas vide */ /* provoque une erreur si la liste est vide */ Rlist cdr(Rlist l){

2. Normalement, il ne devrait pas y avoir de taille maximale pour une liste. Pour respecter le type abstrait, lajout dun lment doit toujours tre possible (sauf probl`me dallocation ee e e mmoire). Modier la fonction cons pour respecter cette contrainte. e
/* renvoie une nouvelle liste dont le premier lment est e et la fin est nxt */ e e Rlist cons(Element e, Rlist nxt){

3. Que pensez-vous de la dnition suivante de la fonction permettant de recopier une liste, e en considrant la dnition du type Rlist utilis dans cet exercice ? e e e
Rlist copyRlist(Rlist l){ if(isEmpty(l)) return l; else return cons(car(l),copyRlist(cdr(l))); }

5 pts

Exercice 3. Arbres binaires dentiers Un arbre plein est un arbre binaire non vide de taille n = 2h 1 dont tous les tages sont e compl`tement remplis. Un arbre-max est un arbre binaire plein tel que tous ses noeuds ont une e valeur suprieure aux valeurs des noeuds de leurs sous-arbres. e 1. Ecrire une fonction qui calcule la hauteur dun arbre plein. Cette fonction doit avoir comme complexit O(log n). e int fullHeight(BTree bt){

2. Ecrire une fonction qui teste si un arbre plein. Elle doit renvoyer 0 si larbre nest pas plein ou nimporte quelle valeur positive sinon. Attention, il faut bien vrier que tous les tages e e sont compl`tement remplis ! e int isFull(BTree bt){

3. Ecrire une fonction qui teste si larbre pass en param`tre est un arbre-max. Elle doit e e renvoyer 0 si larbre nest pas un arbre-max ou nimporte quelle valeur positive sinon. int isMaxTree(BTree bt){

4. Dans quel ordre doit-on parcourir un arbre-max pour que le i-`me lment ach soit e ee e suprieur au (2i)-`me et au (2i + 1)-`me ? e e e

7 pts

Exercice 4. Tables de hachage Le but de cet exercice est dimplanter des tables de hachage avec rsolution de collisions par e adressage ouvert avec sondage linaire. Voici les dnitions des types utiliss dans cet exercice : e e e
typedef char *Key; typedef int Value; typedef struct{ Key k; Value v; }Element; typedef struct{ Element* tab; int lg; int (*f)(char *, int); }HashTable;

1. Que signient les termes adressage ouvert et sondage linaire ? e

2. Soient k1 et k2 deux cls direntes qui ont la mme valeur de hachage. Que se passe-t-il e e e si lon ins`re k1 puis k2 dans une table de hachage dnie comme ci-dessus ? Ensuite, on e e retire k1 de la table, puis on cherche k2. Quelle prcaution doit-on prendre pour que cela e fonctionne ?

3. Ecrire les fonctions suivantes : 1. Une fonction qui fabrique un nouvelle table de hachage de longueur lg. Le deuxi`me e argument est la fonction de hachage qui permet de ranger les lments dans la table. ee HashTable makeHashTable(int lg, int (*fct)(Key, int)){

2. Une fonction qui ache les paires (cl,valeur) contenues dans la table de hachage t. e void printH(HashTable t){

3. Une fonction qui renvoie lindice de la case o` se trouve la paire dont la cl est s dans u e la table de hachage t. Si la cl s nest pas dans la table t, la fonction renvoie lindice e de la 1`re case vide suivant celle o` devrait se trouver s. e u lookForH(Key s, HashTable t){

4. Une fonction qui renvoie (si elle existe) la paire dont la cl est s dans la table de e hachage t. Si la cl s nest pas dans la table t, la fonction renvoie {NULL,0}. e Element accessH(Key s, HashTable t){

5. Une fonction qui supprime et renvoie (si elle existe) la paire dont la cl est s dans la e table de hachage *t. Si la cl s nest pas dans la table *t, la fonction renvoie {NULL,0}. e Element deleteH(Key s, HashTable *t){

6. Une fonction qui ajoute ` la table de hachage *t une paire de cl s et de valeur v. a e void addH(Key s, Value v, HashTable *t){

Vous aimerez peut-être aussi