Exercice 1: Algorithme et complexité Exercice 2: Tables de hachage

publicité
L3 IUP AISEM/ICM
Examen Algorithmique et C
15 Avril 2005
Durée 2h - Documents autorisées - Les exercices sont indépendants
Exercice 1:
Algorithme et complexité
Soit un tableau de N entiers.
a. Donner un algorithme permettant de déterminer si les éléments de ce tableau sont triés par
ordre croissant ou pas. Cet algorithme pourra être décrit en pseudo-langage ou à l’aide d’un
organigramme.
b. Déterminer la complexité de votre algorithme, fonction de N, en nombre de comparaisons,
– dans le pire des cas,
– dans le meilleur des cas.
c. Ecrire une fonction en C implémentant cet algorithme. Précisez les données d’entrée et de
sortie de cette fonction.
Exercice 2:
Tables de hachage
On souhaite stocker des nombres entiers positifs en utilisant une table de hachage. La table
possédant N emplacements (de 0 à N-1), on utilise la clef suivante: h(x)=x modulo N.
a. Calculer la valeur de la clé pour chacun des éléments de la liste suivante (N=12): 15, 24, 125,
4, 26, 6, 78, 55, 89
b. En supposant que les éléments soient inclus dans la table de hachage dans l’ordre de la liste et
que la résolution des collisions soit faite en rajoutant un lien suivant à chaque emplacement
de la table, dessiner la table obtenue. Remarque: Par convention un emplacemnt vide aura
pour valeur -1 et un lien suivant non utilisé contiendra la valeur -1.
c. Proposez une implémentation en C d’un emplacement la table de hachage sous la forme d’une
structure.
d. La table est représenté par un tableau dynamique de structures (du type défini ci-dessus).
Ecrire le code en C d’une fonction permettant de créer et d’initialiser une table de hachage.
Cette fonction aura pour entrée le nombre d’emplacements N de la table et pour sortie un
pointeur vers le premier emplacement de la table.
e. Donner l’algorithme et le code en C d’une fonction permettant de vérifier si un élément x est
contenu dans la table.
Exercice 3:
Arbres binaires
a. Dessiner le graphe de l’arbre binaire de recherche obtenu en insérant les éléments de la liste
suivante dans leur ordre d’arrivée: 6, 78, 55, 89, 15, 24, 125, 3, 11
b. Un noeud d’un arbre binaire est représenté par la définition de structure suivante:
typedef struct s_noeud
{ int valeur;
struct s_noeud* gauche;
struct s_noeud* droit;
} t_noeud;
Soit la fonction récursive suivante:
void afficher(t_noeud* noeud)
{ if (noeud!=NULL)
{ afficher(noeud->gauche);
printf("%d \n",noeud->valeur);
afficher(noeud->droit);
}
}
L3 IUP AISEM/ICM
Examen Algorithmique et C
15 Avril 2005
– Donner ce qu’affiche à l’écran cette fonction en partant du noeud de valeur 15.
– Même question en partant de la racine de l’arbre précédent. Dessiner sur le graphe le
parcours des sommets.
Exercice 4:
Compléments de C
Donner, en le justifiant, l’affichage produit par le programme suivant:
#include <stdio.h>
void
void
void
void
f1(int
f2(int
f3(int
f4(int
a, int * b) { a=*b;}
* b, int c) { *b=c;}
** a, int b) {**a=b;}
* a, int b) { f3(&a,b); }
int main()
{
int n1=5, n2=8, n3=10;
f1(n1,&n2);
printf("apres f1: n1=%d, n2=%d, n3=%d\n",n1,n2,n3);
f2(&n3,*(&n1));
printf("apres f2: n1=%d, n2=%d, n3=%d\n",n1,n2,n3);
f4(&n3,n2);
printf("apres f4: n1=%d, n2=%d, n3=%d\n",n1,n2,n3);
return 0;
}
Exercice 5:
Structures de données - Files
On souhaite implémenter une file de nombres entiers de type FIFO à l’aide d’une liste simplement
chaı̂née. Chaque élément de la file est représentée par une structure définie ainsi:
typedef struct s_element
{ int valeur;
struct s_element* suiv;
} t_element;
La file elle même est représentée par la structure suivante:
typedef struct s_file
{ t_element *premier;
t_element *dernier;
} t_file;
dans laquelle le champ premier est un pointeur vers le premier élément de la file et dernier un
pointeur vers le dernier élément.
Pour manipuler la file, on souhaite écrire 2 primitives:
– une primitive inserer permettant d’inserer une valeur en dernière position de la file.
– une primitive retirer permettant de supprimer le premier élément de la file en ayant préalablement
renvoyé sa valeur.
a. Dessiner une file (variable de type t file) contenant les 4 éléments suivants: 5, 22, 1, 8 (dans
l’ordre d’arrivée, du premier au dernier)
b. Dessiner la file précédente après l’insertion de l’élément 12.
c. Dessiner maintenant la file après l’exécution de la primitive retirer et préciser la valeur
renvoyée par la primitive.
d. Donner les entrées/sorties de la primitive insérer et en déduire l’ interface en C de la fonction
correspondante.
e. Même question pour la primitive retirer.
Téléchargement