Telechargé par said Trhanint

Examen dalgorithmes et structures de don (4)

publicité
Département Mathématiques, Physique & Informatique
Faculté Polydisciplinaire de Taza
Université Sidi Mohamed Ben Abdallah de Fès
Examen d'Algorithmes et Structure de Données
Session normale
Durée: 3 heures
Le 14 Juin 2013
N.B: Dans tous les exercices, on suppose que les données à traiter sont des valeurs entières.
Exercice 1: Tri Shell (6 points)
Le tri de Shell est une amélioration du tri par insertion en observant deux choses :


Le tri par insertion est efficace si la liste est à peu près triée (1)
Le tri par insertion est inefficace en moyenne car il ne déplace les valeurs que d'une position
par instruction (2)
Le tri de Shell trie chaque liste d'éléments séparés de k position (k=N/2 au départ, N nombre total
des éléments du tableau) chacun avec le tri par insertion. L'algorithme effectue plusieurs fois cette
opération sur les éléments séparés de k=k/2 positions jusqu'à ce que k=1 ce qui est équivaut à trier
tous les éléments ensemble.
Le fait de commencer avec des éléments espacés permet de pallier l'inconvénient (2), tandis que
lorsque l'on tri à la fin avec un espacement de 1 (tri par insertion ordinaire), on tire parti de
l'avantage (1).
1. Rappeler le principe du tri par insertion dans l'ordre croissant puis donner son algorithme
2. Écrire la fonction tri_Shell() qui permet de trier selon le principe du tri Shell un tableau T
de N valeurs dans l'ordre croissant puis l'ex écuter à la main sur le tableau suivant:
5 6 1 4 0 7 3 2
3. Calculer la complexité du tri Shell dans le pire et le meilleur des cas
Exercice 2: Lises doublement chainées (8 points)
Les listes doublement chainées sont des structures de données pour lesquelles chaque chainon à un
pointeur suivant qui pointe vers le chainon suivant et un pointeur precedent qui pointe vers le
chainon précédent
NULL
*
4
*
*
2
*
*
1
*
*
0
*
NULL
L
1. Donner la définition d'une liste doublement chainée
2. Réaliser les fonctions de gestion des listes doublement chainées suivantes:
a. Ajouter_entête() qui ajoute une valeur à la fin d'une liste passé comme paramètre
b. Afficher() qui affiche les valeurs d’une liste passée comme paramètre
Tournez la page
c. Rechercher() qui recherche une valeur dans une liste et retourne un pointeur sur la première
occurrence de cette valeur
d. Supprimer() qui supprime une valeur de la liste, la liste et la valeur sont passées comme
paramètres
e. Inserer() qui insère un chaînon dans la liste, le pointeur sur le chaînon et la liste sont passés
comme paramètres
f. Trier() qui trie une liste en utilisant un tri par insertion
g. Eclater() qui reçoit une liste et l’éclate en deux sous listes, une renferme les valeurs positives
et l’autre les valeurs négatives
Exercice 3 : Arbres binaires de recherche
(6 points)
Rappel: Un arbre binaire de recherche (ABR) est un arbre binaire dans lequel chaque nœud possède
une clé, telle que chaque nœud du sous-arbre gauche ait une clé inférieure à celle du nœud
considéré, et que chaque nœud du sous-arbre droit possède une clé supérieure à celle-ci.
1. Dessinez les arbres binaires de recherche de hauteur 2,3,4 et 5 pour le même ensemble de clés
S= 1,4,5,10,16,17,21. Donner pour chaque arbre l'affichage préfixe, infixe et postfixe.
2. Créer une fonction Minimum() qui retourne la plus petite valeur d'un arbre binaire de recherche.
3. Créer une fonction Fusionner() qui permet de fusionner deux arbres binaires de recherche A et B
donnés. Une clé (valeur) qui apparaît dans les deux arbres ne doit pas être dupliquée.
Bon courage…
Téléchargement