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 ?

  1. 2, 252, 401, 398, 330, 344, 397, 363.
  2. 924, 220, 911, 244, 898, 258, 362, 363.
  3. 925, 202, 911, 240, 912, 245, 363.
  4. 2, 399, 387, 219, 266, 382, 381, 278, 363.
  5. 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)

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 .