Travaux Pratiques du L5 1999-2000
Les sujets seront traités en une ou deux séances. Pour chaque
sujet, les étudiants rédigent un petit rapport de synthèse
clair, concis et précis ( 4 pages au plus ). Quelques lignes de
codes particulièrement intéressantes pourront être
incluses dans le document qui ne doit contenir aucun listing.
ETUDE DE QUICK SORT
L'objectif de cette feuille de travaux pratiques est
de vous faire analyser les performances du tri rapide QuickSort. Trois
expériences sont proposées. Dans la première,
vous devez mettre en évidence le comportement non homogène
du tri rapide QuickSort. Dans la seconde, vous déterminerez
la performance de votre implantation de QuickSort. La troisième
est un petit challenge : usez de toute votre astuce pour créer
un programme optimal. A vous de jouer !
mots clefs : la commande times, le tri rapide QuickSort,
et le hasard.
Expérience I.
Soit T une table de nombres, de longueur n. Un couple d'indices (i,j) est
un dérangement de la table T si i < j et T[j] <
T[i]. Le nombre de dérangement de T est compris entre 0 et
n(n-1)/2. On constate qu'un tableau trié est un tableau sans
dérangements.
-
Implanter une version TriRapideCompteur(T) qui trie la table T par
une version de QuickSort qui renvoie le nombre de comparaisons effectuées
au cours de la procédure de tri.
-
Ecrire une procédure Derangements(T) qui calcule le nombre
de dérangements de la table $T$.
-
Ecrire une procédure GMT( n, p ) qui construit une table sans
dérangements, lui applique p permutations aléatoires avant
de la retourner.
-
Pour une valeur de n assez grande effectuée l'expérience
décrite ci-dessous. Faire une représentation graphique
et commenter.
p = 0;
m = n*(n-1)/2;
REPETER
table = GMT(n, p)
cpt = TRI-RAPIDE-COMPTEUR( table)
der = DERANGEMENTS( table)
DETRUIRE( table )
IMPRIMER( der / m , cpt / m )
INC( p );
JUSQUA ( p n/4)
Expérience II
Vous utiliserez la fonction X-MUL(vec ) définie par
unsigned long int X-MUL(unsigned long int x )
{
x = x << 1;
if ( x < ( 1 <<
30) ) return(x);
return( x ^ 1073741907
);
}
-
Implanter un algorithme de TriRapide, TriRapide( t ).
-
On pose x[0] et on construit la suite x[i] = X-MUL( x[i-1]
) . La suite obtenue est périodique, pourquoi ? N'essayez
pas de trouver la période!
-
Ecrire une procédure GMrandT(n) qui construit une table de longueur
n définie par T[ i ] = x [ i ] pour les indices
i compris entre 0 et n-2. Observez-les tableaux retournés par GMrandT(n)
, commentaires ?
-
Repéter plusieurs fois l'expérience ci-dessous, pour
quelques valeurs de n bien choisies.
-
Placez les valeurs obtenues dans une table, puis en déduire les
facteurs cachés de votre algorithme.
-
En théorie, quelle serait est la dimension de la plus grande table
que pourrait trier votre implantation du tri rapide en moins d'une heure
?
table = GMrandT(n )
temps de TRI-RAPIDE( table)
DETRUIRE( table );
IMPRIMER( temps , n )
Expérience III
Procédez à toutes les optimisations pour améliorer
les performances de votre procédure de tri rapide. Quelle est la
taille de la plus grande table que vous arrivez à trier en moins
de 5 minutes ?
GESTION D'UNE TABLE DE SYMBOLES
mots clefs : la commande flex, liste chaînée,
fonction de hachage.
Expérience I.
Utilisez la commande unix flex pour construire un analyseur lexical capable
de reconnaître les mots dans un fichier de caractère.
Expérience II.
Incorporez une gestion de liste de symboles à votre analyseur lexical
de sorte à donner la liste des mots qui apparaissent dans le fichier
source, en précisant leur fréquence.
Expérience III.
Implantez la fonction de hachage modulaire de base B et de module M.
Expérience IV.
Ecrire un analyseur lexical pour expérimenter les différentes
fonctions de hachages modulaires. Cet analyseur prend en entrée
un fichier de caractères et retourne la distribution des hachés
des mots du texte source. Choisissez un fichier de mots assez important
puis procédez à des expériences faisant varier M et
B. Commentaires ?
COMPRESSION DE HUFFMAN
mots clefs : arbres binaires, code préfixes et codage
de Huffman, manipulation de bits.
Il s'agit d'écrire un logiciel de compression de texte. Les étudiants
se répartiront en cinq groupes. Un groupe se charge de l'animation,
organise le travail préliminaire et rédige un cahier des
charges. Les quatre autres groupes développent un des quatre modules
: construction de l'arbre de Huffman, compression, décompression
et finalisation d'un produit. Les mangeurs de pizzas se mettront au travail
une fois d'accord sur les choix des structures, des procédures et
fonctions à développer.
PARCOURS HAMILTONIEN-BACKTRACKING
mots clefs : graphe, chemin et cycle Hamiltonien, backtracking,
heuristique.
Soit E un échiquier n x n est un tableau indexé
par les couples d'entiers [0,n[ x [0, n[. Conformément aux règles
du jeu d'échecs, un cavalier peut se déplacer de la case
(x,y) vers la case (x', y') si :
(x' - x )*( y' - y ) = + ou - 2.
Un parcours de cavalier qui passe par toutes les cases
de l'échiquier une et une seule fois est un parcours Hamiltonien,
si un dernier déplacement permet de revenir sur la case de départ,
on dit que c'est un cycle Hamiltonien. Pour en savoir un petit peu plus
sur les graphes, problèmes et terminologie.
http://www-leibniz.imag.fr/GRAPH/francais/apercu.html
-
Ecrire deux procédures ParcoursHamiltonien( org: case
) et CycleHamiltonien( org : case) pour déterminer tous les parcours
et cycles Hamiltonien partant de la case org.
-
Faire une table des valeurs trouvées
-
Donner une expression de la complexité de votre algorithme.
-
Expliquez comment votre algorithme se perd dans des analyses
inutiles, donner un exemple.
-
Réécrire votre algorithme en privilégiant
les déplacements vers les cases les plus contraignantes.
-
Alors ?
GESTION DES ENSEMBLES DISJOINTS
mots clefs : graphes, composantes connexes,
ensembles dijoints.
Il sagit d'implanter et discuter les différentes
heuristiques abordées en cours dans le cadre de la recherche
des composantes connexes d'un graphe par la méthode
des ensembles disjoints. On considere une famille de graphes alétoires
G(K,M) parametree par des couples d'entiers. Les sommets du
graphe G(K,M) sont les entiers compris entre 0 et M-1. Pour chaque
couple (x,y), on decide avec une pobabilité K/M de créer
une arete de x vers y.
COMPOSANTES-CONNEXES( X , A)
n = CARDINAL(X);
ed = TABLEAU de n ENSEMBLES DISJOINTS;
POUR CHAQUE x DANS X
ed [ x ] = SINGLETON( x)
POUR CHAQUE (x,y) DANS A
SI REPRESENTANT( ed[x]
) <> REPRESENTANT( ed[y])
ALORS UNION( ed[x], ed[y] )
[ 1 ] Quel est le nombre de composantes
connexes de G(K,M) , pour 1<=K<=M<=100.
[ 2 ] Mesurer le temps de calcul de
votre programme de recherche de composante connexes applique a G(3, M)
pour les valeurs voisines
de 10000. Considerer 4 implantations : sans heuristique,
union par rang, compression de chemins et en combinant union par rang et
la compression de chemins.
[ 3 ] Commenter les
temps d'exécutions.