UM2 - Faculté des Sciences – Feuille TD HLIN301– Septembre 2014 1
Tri de Tableaux
1. Ecrire un algorithme qui, étant donné 2 tableaux d’entier non triés Aet B, de taille respective net p, compte
le nombre d’entiers appartenant à la fois à Aet à B. Quelle est sa complexité en nombre de comparaisons entre
éléments de tableaux.
Améliore-t-on cette complexité si l’un des tableaux est trié et si oui, précisez lequel.
Améliore-t-on également cette complexité si les 2 tableaux sont triés ?
2. (*) Étant donné un tableau on cherche l’élément le plus fréquent dans T. Donnez un algorithme dans le cas
général, puis dans le cas où le tableau est trié. Vous donnerez les complexités dans chacun des cas.
3. Donnez un algorithme vérifiant si tous les éléments d’un tableau sont différents. Donnez un deuxième algorithme
comptant le nombre d’éléments différents d’un tableau.
4. Le Tri par fusion est un autre algorithme de tri appliquant le principe Diviser pour résoudre. Son principe pour
trier un tableau à néléments est :
trier le sous-tableau constitué des n/2premiers éléments
trier le sous-tableau constitué des n/2derniers éléments
fusionner les éléments des 2 sous-tableaux triés.
Ecrivez et prouvez cet algorithme. Donnez sa complexité dans le pire et dans le meilleur des cas.
5. Le problème du Drapeau Hollandais consiste à trier un tableau dont les éléments ne peuvent prendre que 3
valeurs que l’on notera R, V, B avec l’ordre R < V < B. Donnez un algorithme linéaire pour ce problème.
6. On s’intéresse au problème de tri particulier suivant : les éléments à trier prennent leur valeur dans un
intervalle fini et «petit» connu a priori. On prendra comme exemple le tri d’un tableau Tde notes à valeurs
entières comprises entre 0et 20. Pour ce problème on peut utiliser un tableau supplémentaire NbNotes indicé
de 0 à 20, tel que pour tout indice i NbNotes[i]est le nombre d’éléments de Tégaux à i.
Ecrivez l’algorithme et donnez sa complexité.
7. On veut trier un tableau Tdont les éléments sont des entiers de kchiffres. T[j][l]désigne le l`eme chiffre du j`eme
nombre. Le principe du Tri Par Base est de maintenir l’invariant suivant :
”Après la i`eme itération les éléments de Tsont triés selon les ichiffres de poids faible”
A la fin de la k`eme itération, le tableau est donc trié.
Pour maintenir l’invariant on utilise un tableau Fde 10 files, une file par chiffre : F[j](0 j9) est la file
correspondant au chiffre j.
Le traitement effectué à la i`eme itération est :
prendre les éléments dans l’ordre de Tet les insérer dans la file correspondant à leur i`eme chiffre.
le nouveau tableau Test obtenu en prenant tous les éléments de F[0], puis de F[1], . . ., puis de F[9].
Ecrivez l’algorithme en utilisant les opérations sur les files :
fileVide?(P),créerFile,têteFile(F),ajouterFile(F,e),retirerFile(F).
Analysez votre algorithme.
Comment adapter l’algorithme précédent pour trier un tableau de mots construits sur l’alphabet {a, . . . , z}
selon l’ordre lexicographique.
UM2 - Faculté des Sciences – Feuille TD HLIN301– Septembre 2014 2
8. (*) L’algorithme de calcul d’une valeur pivot, vu en cours pour l’algorithme de tri rapide, est :
Algorithme 1 :Pivot(T,g,d,m)
Données :g < d, T [g . . . d]
Résultat :m[g . . . d]
T[g . . . d]contient les mêmes élements qu’en entrée
i[g . . . m 1], T [i]T[m],i[m+ 1 . . . d], T [m]< T [i]
début
pT[g];inf g+ 1 ;sup d;
tant que inf sup faire
si T[inf]palors
inf inf + 1
sinon
T[inf]T[sup];sup sup 1
fin si
fin tq
T[g]T[sup];msup ;
fin
Cet algorithme optimise le nombre de comparaisons mais pas le nombre d’échanges de place entre éléments du
tableau. Combien d’échange réalise l’algorithme pour le tableau suivant (on suppose g=1 et d=10) :
1 20 3 12 11 19 14 17 18 15
Modifiez l’algorithme afin qu’il minimise le nombre d’échanges.
9. Aet Bétant 2 tableaux, il s’agit de vérifier si l’ensemble des valeurs des éléments de Aest inclus dans l’ensemble
des valeurs des éléments de Bmais en comptant aussi le nombre d’occurrences. Lorsqu’une valeur apparaît
plusieurs fois dans A, son nombre d’occurrences dans Bdoit être supérieur à son nombre d’occurrences dans
A. Ainsi on dira que A[1..n]est inclus dans B[1..p]si et seulement si
i[1..n],nbOccurrences(A[i],A)nbOccurrences(A[i],B) nbOccurrences(x,T) désigne le nombre
d’éléments du tableau Tdont la valeur est x.
Par exemple le tableau 5 4 8 4 4 est inclus dans le tableau 6 4 8 4 5 5 6 4 4 .
Par contre 5 4 8 4 4 n’est pas inclus dans le tableau 6 6 5 4 5 8 6 4 9 car la valeur 4
apparaît 3 fois dans le premier tableau et seulement 2 fois dans le second tableau.
Algorithme 2 :inclus(dA[1..n] : tableau,dB[1..p] : tableau ) : booléen
Données :A[1..n]et B[1..p]sont deux tableaux
Résultat : Renvoie Vrai si et seulement si Aet Bont même ensemble de valeurs.
(a) Rappelez, sans réécrire les algorithmes, la meilleure complexité des algorithmes calculant nbOccurrences(x,T)
lorsque Test un tableau non trié de taille k. On appelle nbOcc(d x:entier,d T : Tableau) ce premier
algorithme.
lorsque Test un tableau trié de taille k. Appelons nbOccTrié(d x:entier,d T : Tableau) ce deuxième
algorithme.
(b) En utilisant nbOcc(x,T), écrivez un premier algorithme pour inclus(A,B) en supposant que ni Ani B
ne sont triés. L’algorithme ne doit pas trier les tableaux. Quelle est sa complexité ?
(c) On suppose que les 2 tableaux Aet Bsont triés.
i. On reprend l’algorithme précédent en remplaçant nbOcc(x,T) par nbOccTrié(x,T). Quelle est la
complexité de l’algorithme obtenu.
ii. On peut améliorer cette complexité. En effet il existe un algorithme de complexité linéaire pour ce
problème. Écrivez un algorithme de complexité linéaire pour inclus(A,B).
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !