Devoir surveill´e n˚3
MPSI option informatique Lyc´ee Clemenceau
Mardi 9 juin 2015
Exercice 1
On admettra que la multiplication de deux entiers naturels se fait en temps constant.
1) On s’ineresse dans cette partie au calcul de la puissance k-i`eme d’un entier naturel n, pour un
entier naturel k1.
a) Dans un premier temps, on utilise un algorithme na¨ıf :
let rec puissance n k =
if k= 1 then n
else n * (puissance n (k-1));;
val puissance : int -> int -> int
Quelle est la complexit´e de cet algorithme ? Le justifier pr´ecis´ement.
b) On utilise ensuite l’algorithme suivant :
let rec puissance2 n k =
if k >1 then
let x = puissance2 n (k/2) in
if k mod2 =0 then
x*x
elsex*x*n
else n;;
val puissance2 : int -> int -> int
i) D´ecrire l’ex´ecution du programme puissance2 sur l’entr´ee (2,7).
ii) D´ecrire l’ex´ecution du programme puissance2 sur l’entr´ee (2,8).
iii) D´emontrer que le nombre d’appels r´ecursifs `a l’inerieur du programme puissance2 sur
l’entr´ee (n, k) est au plus de log2k+ 1. En d´eduire que le programme termine.
iv) Justifier que ce programme est correct.
v) ´
Evaluer la complexit´e de ce programme.
2) On s’ineresse ici au probl`eme de d´eterminer si un entier naturel est une puissance non triviale
d’un nombre entier ou non : on dit qu’un nombre entier naturel n est une puissance enti`ere s’il
existe deux entiers naturels ket mtous deux >1 tels que n=mk.
a) ´
Ecrire la fonction :
test_puissance : int -> int -> bool
qui prend en entr´ee les entiers naturels n > 1 et k > 1 et renvoie le bool´een true s’il existe un
entier naturel mtel que n=mket false sinon.
Note : l’´enonc´e original mentionne un Nqui n’est pas d´efini.
b) i) Soit nun entier naturel. On suppose que nest une puissance enti`ere : Soient ket mdeux
entiers naturels >1 tels que n=mk. Justifier que k6log2(n).
ii) ´
Ecrire la fonction :
1
test_puissance_entiere : int -> bool
qui prend en entr´ee l’entier naturel n > 1 et renvoie le bool´een true s’il existe deux entiers
naturels ket mtous deux >1 tels que n=mket false sinon.
iii) D´emontrer que la complexit´e de ce programme est au plus O(nlog2(n) log2(k)).
iv) En d´eduire la fonction :
liste1_puissances_entieres : int -> int list
qui prend en entr´ee l’entier naturel n > 1 et renvoie la liste des entiers naturels compris
entre 2 et nqui sont des puissances enti`eres.
c) En vous inspirant du crible d’Erathosth`ene, ´ecrire la fonction :
liste2_puissances_entieres : int -> int list
qui prend en entr´ee l’entier naturel n > 1 et renvoie la liste des entiers naturels compris entre
2 et nqui sont des puissances enti`eres.
Exercice 2 : parcours en escalier dans un tableau
Soit M une matrice de n+1 lignes et de n+1 colonnes (n > 0), telle que mi,j = 2i3jpour 0 6i6n
et 0 6j6n.
1) ´
Ecrire une fonction remplir de param`etre n, de remplissage du tableau `a deux dimensions repr´esentant
la matrice M.
2) Quel est le nombre total de multiplications de votre algorithme ?
3) ´
Ecrire la fonction pgcd qui a prend pour arguments une matrice M(telle que mi,j = 2i3jpour
06i6net 0 6j6n) et quatre indices i,j,k,ldans [[0, n]] , et retourne pour r´esultat la valeur
du plus grand commun diviseur de mi,j et de mk,l.
4) On dispose d’une matrice M telle que mi,j = 2i3jpour 0 6i6net 0 6j6n, ´ecrire une fonction
pgm qui ´etant donn´e un entier p, 1 6p62n3n, calcule les indices i,jdu plus grand des minorants
de pde la forme 2i3j.
On s’efforcera dans cette question de minimiser le nombre de comparaisons en exploitant la re-
marque qui suit.
Remarque : Si sur la ligne i0le plus grand des minorants de pse trouve en colonne j0, alors sur
la ligne i0+ 1 le plus grand des minorants de pest :
Soit l’´el´ement qui se trouve sur en (i0+ 1, j0), si mi0+1,j0= 2mi0,j0est inf´erieur ou ´egal `a p.
Soit l’´el´ement qui se trouve en (i0+ 1, j01) , si mi0+1,j0= 2mi0,j0est strictement sup´erieur
`a p, car dans ce cas mi0+1,j01=2
3mi0,j0est alors le plus grand des minorants de psur la ligne
i0+ 1.
5) Combien de comparaisons mettant en jeu un ´el´ement de la matrice Meffectue votre algorithme ?
2
Probl`eme
Le but de ce probl`eme est l’´etude de la structure de tas (arbre binaire parfait partiellement
tri´e) et de son application au tri de listes d’entiers. L’int´erˆet de cette structure est double : elle permet
non seulement de r´eduire le nombre d’op´erations de comparaison n´ecessaires au tri d’une liste mais
elle peut ´egalement ˆetre implanee de mani`ere simple et efficace en utilisant une structure lin´eaire de
type liste ou tableau.
L’algorithme du tri par tas exploite deux op´erations ´el´ementaires sur les tas : l’insertion d’un
nouveau noeud et l’extraction de la racine. Nous n’´etudierons que l’op´eration d’insertion.
Cette ´etude sera r´ealis´ee en trois ´etapes : l’´etude de l’op´eration d’insertion dans les structures
d’arbre parfait puis de tas, et l’utilisation de la structure de tas dans un algorithme de tri.
I) Repr´esentation des arbres binaires
Un arbre binaire compos´e de noeuds ´etiquet´es par des entiers est repr´esent´e par le type CaML
type arbre = Vide | Noeud of int * arbre * arbre;;
Exemple 1 Le terme suivant
Noeud ( 7 ,
ddddddddNoeud ( 2 ,
ddddddddddddVide ,
ddddddddddddNoeud ( 11, Vide , Vide ) ) ,
ddddddddNoeud ( 13,
ddddddddddddNoeud ( 5, Vide , Vide ) ,
ddddddddddddNoeud ( 1,
ddddddddddddddddNoeud ( 18, Vide , Vide ) ,
ddddddddddddddddVide ) ) )
est alors associ´e `a l’arbre binaire repr´esent´e graphiquement par :
Question 1 : ´
Ecrire en CaML une fonction taille de type arbre -> int telle que l’appel
( taille a ) renvoie le nombre de noeuds contenus dans l’arbre a. Cette fonction devra ˆetre r´ecursive
ou faire appel `a des fonctions auxiliaires r´ecursives.
La profondeur d’un noeud est d´efinie comme le nombre de liaisons entre la racine de l’arbre et ce
noeud. La profondeur d’un arbre est ´egale au maximum des profondeurs de ses noeuds. Un niveau
dans l’arbre est compos´e de tous les noeuds ayant la mˆeme profondeur.
Dans l’exemple pr´ec´edent, l’arbre est de profondeur 3 et les diff´erents niveaux contiennent les
noeuds suivants :
profondeur contenu
0 7
1 2,13
2 1, 5,11
3 18
3
II) ´
Etude des arbres binaires
II.1) Arbres binaires complets
Un arbre binaire complet est un arbre binaire dont tous les niveaux sont complets, c’est-`a-dire que
tous les noeuds d’un mˆeme niveau ont deux fils sauf les noeuds du niveau le plus profond qui n’ont
aucun fils. Autrement dit, le niveau de profondeur p contient 2pnoeuds.
Exemple 2 :
Question 2 : Calculer le nombre de noeuds d’un arbre binaire complet de profondeur p.
II.2 Arbres binaires parfaits
Un arbre binaire parfait est un arbre binaire dont tous les niveaux sont complets sauf le niveau le
plus profond qui peut ˆetre incomplet auquel cas ses noeuds sont align´es `a gauche de l’arbre.
Exemple 3 :
On remarque qu’il s’agit d’un sous-arbre complet ´etendu par un dernier niveau partiel contenant
les noeuds les plus profonds.
On remarque ´egalement que : si l’on compl`ete la partie droite du niveau partiel d’un arbre parfait,
on obtient un arbre complet.
Question 3 : D´eterminer un encadrement du nombre nde noeuds dans un arbre parfait en fonc-
tion de la profondeur pde cet arbre.
Question 4 : En d´eduire la profondeur d’un arbre parfait contenant n´el´ements.
II.3 Num´erotation et occurrence des noeuds
L’algorithme na¨ıf d’insertion d’un noeud dans un arbre parfait repose sur un parcours en largeur
de l’arbre pour trouver la position du dernier noeud.
Ce parcours coˆuteux (complexit´e de l’ordre de O(taillle(arbre)) peut ˆetre ´evit´e en utilisant une
repr´esentation du chemin menant de la racine `a la position o`u doit ˆetre ins´er´e le nouveau noeud.
L’algorithme d’insertion consiste ensuite `a parcourir l’arbre en suivant le chemin jusqu’`a atteindre
la position puis `a ins´erer le nouveau noeud.
Les questions suivantes permettent de construire cette repr´esentation du chemin.
4
II.3.1 Num´erotation hi´erarchique des noeuds
La num´erotation hi´erarchique des noeuds d’un arbre parfait consiste `a les num´eroter par un par-
cours en largeur en partant de la racine (num´ero 1) et en parcourant chaque niveau de gauche `a
droite.
Dans les exemples suivants, le num´ero de chaque noeud sera not´e en-dessous de son ´etiquette.
Exemple 4
Question 5 : Soit un noeud de num´ero ndans le niveau de profondeur p, calculer le nombre de
noeuds qui se trouvent `a sa gauche dans le niveau de profondeur p.
Question 6 : En d´eduire le nombre de noeuds, dans le niveau de profondeur p+1, qui se trouvent
`a la gauche des fils du noeud de num´ero n(nfaisant parti du niveau de profondeur p).
Question 7 : Soit un noeud de num´ero n, calculer les num´eros de ses fils gauche et droit.
Question 8 : D´eduire de la question pr´ec´edente, le num´ero du p`ere du noeud de num´ero n.
Pour d´efinir plus simplement les op´erations de manipulation des noeuds d’un arbre parfait, nous
utiliserons syst´ematiquement les num´eros des noeuds.
II.3.2 Occurrence d’un arbre
Pour acc´eder `a un noeud, nous devons repr´esenter le chemin dans l’arbre allant de la racine au
noeud. Pour cela, nous ´etiquetons la liaison entre un noeud et son fils gauche par l’entier O et la liaison
entre un noeud et son fils droit par l’entier 1. Nous appelons alors occurrence, ou chemin, du noeud
de num´ero n la liste des ´etiquettes suivies pour aller de la racine `a ce noeud. Dans l’exemple suivant,
l’occurrence du noeud de num´ero 11 ´etiquet´e par la valeur 7 est 0,l.l.
Exemple 5
5
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !