Algorithmique et programmation
Louis Granboulan
1   Structures de données
- 
Files et piles
 
 Rappels : une file est munie de deux opérations,
 enfiler et défiler et d'un test vide.
 Fonctionnement FIFO (first in, first out).
 Une pile munie de deux opérations, push et pop
 et d'un test vide.
 Fonctionnement LIFO (last in, first out).
- 
  Trouvez une méthode pour simuler une file
 avec des piles, telle que la complexité amortie
 d'une opération sur la file soit une constante.
 
 
- Arbres binaires
 
 Rappels : tout noeud d'un arbre binaire a éventuellement
 un fils gauche et un fils droit. Si on complète cet arbre en
 rajoutant des fils à tous les noeuds qui en ont 0 ou 1,
 on obtient un arbre binaire complet et les noeuds rajoutés
 sont appelés feuilles de l'arbre.
 On note n la taille d'un arbre binaire, c'est-à-dire
 le nombre de ses noeuds. L'arbre binaire complet
 correspondant a donc n+1 feuilles et n noeuds (internes).
 
 On se propose de calculer le nombre Cn d'arbres
 binaires de taille n, appelé nombre de Catalan.
- 
  Commencez par établir une correspondance
 entre les arbres binaires complets de taille n dont un noeud
 ou une feuille est distingué et les arbres binaires complets
 de taille n+1 dont une feuille est distinguée. En déduire que
 (n+2)Cn+1 = 2 (2n+1)Cn.
 
-  En déduire que Cn = 1/n+1(2n n).
 
-  Donner un algorithme de génération aléatoire et
 équiprobable d'un arbre binaire de taille n.
 
 
2   Comparaisons et tri
- 
Minimum
 
- 
  Montrer, à l'aide d'un algorithme, que le minimum
 d'un ensemble totalement ordonné de n éléments peut être déterminé
 en n-1 comparaisons.
 
-  Est-ce la meilleure borne possible ?
 
-  Évaluer le nombre moyen d'opérations effectuées par
 votre algorithme
 
 
- Minimum et maximum
 
- 
  Montrer, à l'aide d'un algorithme, que le minimum
 et le maximum d'un ensemble totalement ordonné de n éléments
 peuvent être déterminés en ⎡ 3n/2⎤-2 comparaisons.
 
-  Est-ce la meilleure borne possible ?
 
 
- Tri d'un petit nombre d'éléments
 
 Soit S(n) le nombre minimal de comparaisons pour trier n éléments.
- 
  Montrer que S(n) ≥ ⎡ log2 n!⎤.
 
-  Déterminer les valeurs exactes de S(1), S(2), S(3),
 S(4) et S(5).
 
 
- Sélection de la médiane ou de l'élément d'un rand donné
 
- 
  Trouver un algorithme qui donne la médiane de n éléments
 en temps linéaire. 
 On partitionnera par exemple en groupes de m éléments
 dont on déterninera la médiane.
 
 
 Montrer que cet algorithme permet aussi de donner
 l'élément de rang i en temps linéaire.
-  Si on appelle M(n) le nombre minimal de comparaisons
 pour obtenir la médiane de n éléments, encadrer et essayer de
 déterminer sa valeur pour les petites valeurs de n.
 
 
3   Tri Shell
- 
Rappels sur le tri par insertion directe
 
 Soit un tableau contenant n valeurs distinctes.
 Le tri par insertion directe consiste à insérer un par un les
éléments de la liste dans la fin du tableau, contenant les éléments déjà triés.
- 
  Pour une permutation σ, on appelle inversion
 un couple i<j tel que σ(i)>σ(j).
 Évaluer le nombre moyen d'inversions d'une permutation
 de n éléments.
 
-  Étudier la complexité de l'algorithme en nombre de
 comparaisons et d'affectations.
 
-  Réfléchir aux différentes façons d'améliorer cet
	 algorithme
 
 
- Tri Shell
 
 L'idée est d'essayer de gagner sur le nombre d'affectations en insérant
 dans des sous-listes (et donc en faisant faire de plus grands déplacements).
 L'algorithme consiste en un tri par insertion dans des sous-listes 
 contenant de plus en plus d'éléments, de telle sorte que les éléments
 soient de plus en plus proches de leur position finale (D. Shell, 1959).
 
 On dit qu'un tableau est h-trié si les h sous-tableaux
 regroupant les éléments d'indice différant d'un multiple de h
 sont triés.
 C'est-à-dire que les suites (xi, xi+h, xi+2h, ...)
 pour i = 1, ..., h sont triées.
 
 Pour le tri Shell,
 on choisit une suite entière décroissante ht, ht-1, ... , h1
 avec h1 = 1. On commence par ht-trier le tableau,
 puis on continuer avec ht-1, etc.
 Le hs-tri se fait par exemple par insertion directe,
 pour chaque sous-tableau.
- 
  Prouver la correction de cet algorithme de tri.
 
-  Prouver que le h-tri d'un ensemble k-trié donne un ensemble
 k-trié. En déduire que le cas hs = 2s-1 n'est pas optimal.
 
-  Évaluer le nombre moyen d'inversions d'une permutation 2-triée.
 
- 
  Calculer le nombre de permutations 2-triées.
 
-  Montrer que la somme des nombres d'inversions des permutations
 2-triées de n éléments (avec k=⎣ n/2⎦) est
 An = ∑i=0..k, j=0..k |i-j|(i+j j)
 (n-i-j-1 k-j).
 
-  Prouver A2k+1=2A2k. On peut montrer que 
 A2k=k4k-1.
 
 En déduire la complexité de l'algorithme dans le cas où on fait
 un 2-tri suivi d'un 1-tri.
-  Regarder le cas où on fait un h-tri suivi d'un 1-tri.
 
-  Regarder le cas où hs = 2s-1.
 
 
Knuth, The Art of Computer Programming, vol. 3 :
 Sorting and Searching, pp. 87--92.
This document was translated from LATEX by
HEVEA.