Examen deuxième session – 18 juin 2019
Durée 2h, documents autorisés
Arbres
: Dessiner l’arbre de recherche binaire résultant de l’insertion (dans l’ordre) des entiers suivants:
357, 160, 829, 232, 122, 855, 190, 23, 21, 462, 896, 87, 644, 481, 262, 166
: On suppose que des entiers compris entre 1 et 1000 sont disposés dans un arbre binaire de recherche et que l’on souhaite trouver le nombre 363. Parmi les séquences suivantes, lesquelles ne pourraient pas être la suite des nœuds parcourus ? Pourquoi ?
- 2, 252, 401, 398, 330, 344, 397, 363.
- 924, 220, 911, 244, 898, 258, 362, 363.
- 925, 202, 911, 240, 912, 245, 363.
- 2, 399, 387, 219, 266, 382, 381, 278, 363.
- 935, 278, 347, 621, 299, 392, 358, 363.
: Proposition: soit une feuille d’un arbre binaire de recherche, soit l’ensemble des nœuds sur le chemin de la racine à , soit l’ensemble des nœuds à gauche de et soit l’ensemble des nœuds à droite de . Soient , alors .
Cette proposition est fausse. Le montrer par un contre-exemple.
: Donner le nombre minimal ainsi que le nombre maximal de nœuds d’un arbre binaire de hauteur . Justifier votre réponse.
: Décrire un algorithme qui calcule la somme de toutes les feuilles d’un arbre binaire. Décrire ensuite un algorithme qui calcule la moyenne de ces feuilles.
Programmation dynamique
On se donne une liste de nombres et l’opération binaire définie par . On cherche le parenthésage de qui donne la valeur minimale.
Par exemple, pour la liste , le parenthésages possibles sont et , le premier étant donc le parenthésage de valeur minimale.
: Trouver le parenthésage minimal pour la liste . L’opération est-elle associative?
: Combien de parenthésages sont possibles pour une liste de nombres?
: Prouver que la fonction est monotone pour tout fixé.
: Proposer un algorithme pour calculer le parenthésage minimal d’une liste. Quelle est sa complexité?
: L’algorithme précédent peut-il être optimisé par programmation dynamique? Quel est le gain en complexité?
Programmation linéaire
On considère le programme linéaire suivant :
Minimiser
Sous
.
: Mettre le programme linéaire sous forme relaxée en ajoutant des variables de relaxation.
: Trouver la solution du programme linéaire en détaillant les étapes de l’algorithme du simplexe.
Sacs à dos
Dans cette partie on s’intéresse au problème du sac à dos (plus précisement au problème de la somme de sous-ensembles). On rappelle que le problème du sac à dos calculatoire consiste, étant donné un ensemble d’entiers positifs et un entier , à trouver, s’il existe, un sous-ensemble tel que
Les exercices qui suivent étudient en particulier les sacs à dos super-croissants, qui sont à la base du cryptosystème historique de Merkle-Hellman.
: Soit l’ensemble
Trouver une solution du sac à dos pour .
On présente ci-dessous l’algorithme glouton pour le sac à dos:
Glouton(S, t)
si t < x pour tout x ∈ S
ERREUR: solution non trouvée
sinon
x ← max(x ∈ S tel que x ≤ t)
renvoyer [x]::Glouton(S \ x, t - x)
où S \ x indique l’ensemble S privé de x, [x, y, z] indique
une liste, et A::B indique une concatenation de listes.
: Donner un exemple de sac à dos pour lequel l’algorithme glouton échoue à trouver une solution, bien qu’il en existe une.
: Vérifier que pour l’ensemble
l’algorithme glouton trouve toujours une solution, si elle existe.
: On appelle un ensemble super-croissant si pour tout on a
Prouver que l’algorithme glouton trouve toujours une solution, si elle existe, aux sacs à dos super-croissants.
: Soit , soit un nombre premier, soit , et soit l’ensemble
Donner un algorithme glouton capable de résoudre toute instance de sac à dos .