Licence de Sciences et Technologies, option Informatique Algorithmique Avancée TD 11 : décembre 2006

1. Ramassage

Supposons qu’un programme exalgo (ou C) utilise des structures composées de noeuds où chaque noeud contient deux pointeurs Gauche et Droite. (Les structures ne sont pas forcément des arbres; elles peuvent avoir des sous-structures partagées et/ou des cycles.) Ecrire une fonction avec un paramètre de type pointeur vers un noeud qui parcourt toute la structure accessible à partir de ce noeud et applique désallouer() (ou free()) à chaque noeud une seule fois. Il est interdit d’examiner un noeud déjà libéré. Vous pourriez construire une liste de pointeurs qui contient exactement un pointeur vers chaque noeud de la structure de départ. Si vous faites ça, il faudra bien sûr libérer aussi les noeuds utilisés pour votre liste.

2. Analyse

On veut trier un tableau T qui contient n entiers de l’intervalle [1 ⋯ m^{2}] où m n’est pas très grand; on peut utiliser des tableaux de taille m.

(a) Donner un algorithme qui trie le tableau selon les valeurs de ⌊T [i]/m⌋, en temps linéaire (O(n + m));

(b) Donner un algorithme qui trie le tableau selon les valeurs de T [i] mod m, en temps linéaire (O(n + m));

(c) En utilisant les deux algorithmes précédents donner un algorithme qui trie le tableau en temps linéaire;

(d) Comparer cet algorithme avec un algorithme qui trie le tableau en utilisant O(n log n) comparaisons;

(e) Généraliser l’algorithme et l’analyse au tri de tableaux d’entiers positifs où le majorant est supérieur à m^{2}.