Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

ExamASD3 2021

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 5

U.S.T.O. M.B. / Faculté des Mathématiques et Informatique / Dept.

Informatique 2ème Année Licence


Semestre S3 EXAMEN ALGORITHMIQUES ET STRUCTURES DE DONNEES ASD3
Durée : 1h15’ 28 Mars 2021

EXERCICE 1 : Répondre par Vrai ou Faux (3.5pts)


1. Une fonction récursive est un cas spécial d'appel de fonction où la fonction appelée est elle-même.
2. Pour résoudre un problème, l'utilisation d'une fonction récursive implique forcément une complexité plus faible.
3. La complexité d'un algorithme ne peut être valide que si elle est mesurée indépendamment de la configuration
matérielle et logicielle.
4. Le pire cas indique la complexité dans le cas idéal, et le meilleur cas la complexité dans le cas défavorable.
5. Deux algorithmes de tri de complexité similaire dans le pire cas ont aussi la même complexité dans le meilleur cas.
6. Une complexité de la forme log(n!) est une complexité en Θ(nlogn)
7. Si un arbre binaire est complet, il est aussi parfait.
8. Si un arbre binaire est parfait, il est aussi équilibré.
9. Le nombre maximal de feuilles dans un arbre binaire de hauteur ℎ est 2 × ℎ
10.Un tas est soit un max-tas, un min-tas ou les deux en même temps.
11.La structure en tableau adopté pour les Tas permet des allers retours très faciles entre ancêtres et descendants.
12.Lorsqu'on supprime un nœud dans un max-tas, il est indirectement remplacé par le maximum de ces 2 fils s'il ∃.
13.Plus il y a d'arcs dans un graphe orienté, plus sa densité est faible.
14.La représentation en listes contigües d'un graphe orienté valué occupe bien moins de cases mémoire qu'une
représentation en matrice d'adjacence quand le graphe a une densité élevée (plus de 80% par exemple).

EXERCICE 2 : (4.5pts)
1. Quelle est la complexité de l’algorithme de recherche du minimum d’un tableau de N entiers ?
2. L’algorithme de tri par sélection appliqué à un tableau A de N entiers s’écrit de manière récursive comme suit :
void triSelection(int *A, int deb, int fin)
{ if (deb<fin) {
int min = chercherMinimum(A , deb , fin);
int aux = A[deb]; A[deb] = A[min]; A[min] = aux;
triSelection(A , deb+1 , fin);
}
}
a. Définir la complexité du tri par sélection récursif à l’aide d’une formule de récurrence.
b. A partir de cette formule de récurrence, déterminer la complexité de cet algorithme de tri.

EXERCICE 3 : (7pts)
Partie 1 :
a. Donner l’arbre binaire de recherche contenant les clés : 8,27,13,15,32,50,29,12,30,14,31 en respectant cet ordre.
b. Donner l’arbre après suppression des clés 29 et 27, dans cet ordre.
Partie 2 : (L’arbre binaire de recherche est représenté de manière dynamique)
a. Ecrire une fonction récursive qui affiche l’élément maximal d’un arbre binaire de recherche non vide.
b. Ecrire une fonction récursive abrEquals(Noeud *t1, Noeud *t2) comparant 2 arbres binaires de
recherche de racines respectives t1 et t2. La fonction retourne true si les 2 arbres sont égaux et false sinon.

EXERCICE 4 : (5pts) Un sommet source est un sommet qui n’a pas de prédécesseurs. Etant donné un graphe
orienté de N sommets et M arcs représenté en listes chaînées d’adjacence (voir exemple ci-dessous), écrire une
fonction booléenne permettant de tester si un sommet donné en paramètre est un sommet source. Donner les
instructions de déclaration et analyser la complexité de votre fonction.
Tete
2 1 2 3 NULL

2 3 NULL
3 3 NULL
1 Bon courage…
U.S.T.O. M.B. / Faculté des Mathématiques et Informatique / Dept. Informatique 2ème Année Licence
Semestre S3 EXAMEN ALGORITHMIQUES ET STRUCTURES DE DONNEES ASD3
Durée : 1h15’ 28 Mars 2021

BAREME DETAILLE

Exercice 1 : Répondre par Vrai ou Faux. (3.5pts : 0.25pt pour chaque question)

Une fonction récursive est un cas spécial d'appel de fonction où la fonction appelée est elle-même 1 Vrai

Pour résoudre un problème, l'utilisation d'une fonction récursive implique forcément une complexité plus faible 2 Faux

La complexité d'un algorithme ne peut être valide que si elle est mesurée indépendamment de la configuration
3 Vrai
matérielle et logicielle

Le pire cas indique la complexité dans le cas idéal, et le meilleur cas la complexité dans le cas défavorable 4 Faux

Deux algorithmes de tri de complexité similaire dans le pire cas ont aussi la même complexité dans le meilleur cas 5 Faux

Une complexité de la forme log(n!) est une complexité en Θ(nlogn) 6 Vrai

Si un arbre binaire est complet, il est aussi parfait 7 Vrai

Si un arbre binaire est parfait, il est aussi équilibré 8 Vrai

Le nombre maximal de feuilles dans un arbre binaire de hauteur ℎ est 2 × ℎ 9 Faux

Un tas est soit un max-tas, un min-tas ou les deux en même temps 10 Faux

La structure en tableau adopté pour les Tas permet des allers retours très faciles entre ancêtres et descendants 11 Vrai

Lorsqu'on supprime un nœud dans un max-tas, il est indirectement remplacé par le maximum de ces 2 fils s'il ∃ 12 Vrai

Plus il y a d'arcs dans un graphe orienté, plus sa densité est faible. 13 Faux

La représentation en listes contigües d'un graphe orienté valué occupe bien moins de cases mémoire qu'une
14 Faux
représentation en matrice d'adjacence quand le graphe a une densité élevée (plus de 80% par exemple).
U.S.T.O. M.B. / Faculté des Mathématiques et Informatique / Dept. Informatique 2ème Année Licence
Semestre S3 EXAMEN ALGORITHMIQUES ET STRUCTURES DE DONNEES ASD3
Durée : 1h15’ 28 Mars 2021

Exercice 2 : (4.5pts)

1. Quelle est la complexité de l’algorithme de recherche du minimum d’un tableau de N entiers ?


Réponse : O(N) 0.75pt

2. L’algorithme de tri par sélection appliqué à un tableau A de N entiers s’écrit de manière récursive comme suit :
void triSelection(int *A, int deb, int fin)
{ if (deb<fin) {
int min = chercherMinimum(A , deb , fin);
int aux = A[deb]; A[deb]=A[min]; A[min]=aux;
triSelection(A , deb+1 , fin);
}
}

a. Définir la complexité du tri par sélection récursif à l’aide d’une formule de récurrence.

T(N) = T(N-1)+O(N) 0.75pt


et T(1)=O(1) 0.5pt

b. A partir de cette formule de récurrence, déterminer la complexité de cet algorithme de tri.

 Substitutions jusqu’à obtenir la forme générale : 1.5pts

T(N) = T(N–1) + N = (T(N–2)+N–1) + N = T(N–2) + 2N – 1

= (T(N–3)+N–2) + 2N – 1 = T(N–3) + 3N – 3 (3 = 1+2)

= (T(N–4)+N–3) + 3N – 3 = T(N–4) + 4N – 6 (6 = 1+2+3)

= (T(N–5)+N–4) + 4N – 6 = T(N–5) + 5N – 10 (10 = 1+2+3+4)

= …………………………………. = T(N–p) + pN – (1+2+…+(p-1))

= T(N–p) + pN – p(p-1)/2

Donner 1/1.5 si le terme p(p-1)/2 a été ignoré.

 Déduction de la complexité : 1 pt (0.5 raisonnement + 0.5 résultat final O(N²))


T(1) = O(1) ; on pose donc N – p = 1 soit p = N – 1 ; pour que T(N – p) = O(1)
On obtient
T(N) = O(1) + (N – 1)N – (N – 1)(N – 2)/2 = O(N²)

Enlever 0.25pt si T(0) = O(1) au lieu de T(1)=O(1).


U.S.T.O. M.B. / Faculté des Mathématiques et Informatique / Dept. Informatique 2ème Année Licence
Semestre S3 EXAMEN ALGORITHMIQUES ET STRUCTURES DE DONNEES ASD3
Durée : 1h15’ 28 Mars 2021

Exercice 3 : (7pts)

Partie 1 : 2pts = (a. 1pt b. 1pt)


a. Donner l’arbre binaire de recherche contenant les clés : 8,27,13,15,32,50,29,12,30,14,31 en respectant cet ordre.
8
27
13 32
12 15 29 50
14 30

31

b. Donner l’arbre après suppression des clés 29 et 27, dans cet ordre.
8 8
15 30
13 32 ou bien 13 32
12 14 30 50 12 15 31 50
31 14

Partie 2 : 5pts = (a. 1.5pts b. 3.5pts)


a. Ecrire une fonction récursive qui affiche l’élément maximal d’un arbre binaire de recherche non vide.

void maxABR(Noeud *racine) {


if (racine->filsD==NULL) cout<<racine->val<<endl;
else maxABR(racine->filsD);
}

0.5pt : test du cas de base


0.5pt : affichage du maximum
0.5pt : cas de progression (appel récursif)

b. Ecrire une fonction récursive abrEquals (Noeud *t1, Noeud *t2) comparant 2 arbres binaires de recherche de
racines respectives t1 et t2. La fonction retourne true si les 2 arbres sont égaux et false sinon.
bool abrEquals(Noeud *t1, Noeud *t2){
if (t1==NULL && t2==NULL) return true; ………………………0.75pt
else if (t1==NULL || t2==NULL) return false; ………………………0.75pt
else if (t1->val==t2->val && abrEquals(t1->filsG,t2->filsG) && abrEquals(t1->filsD, t2->filsD))
0.5pt 0.5pt 0.5pt
return true; ……………0.25pt
else return false; ……………0.25pt
}
U.S.T.O. M.B. / Faculté des Mathématiques et Informatique / Dept. Informatique 2ème Année Licence
Semestre S3 EXAMEN ALGORITHMIQUES ET STRUCTURES DE DONNEES ASD3
Durée : 1h15’ 28 Mars 2021

Exercice 4 : (5pts)
Un sommet source est un sommet qui n’a pas de prédécesseurs. Etant donné un graphe orienté de N sommets et
M arcs représenté en listes chaînées d’adjacence (voir exemple ci-dessous), écrire une fonction booléenne
permettant de tester si un sommet donné en paramètre est un sommet source. Donner les instructions de
déclaration et analyser la complexité de votre fonction.

Déclaration (ou son équivalent en langage C) 1pt


const int mxNode=100;
struct Bloc {
int val;
Bloc *suiv;
};

struct Graphe {
Bloc *Tete[mxNode];
int N,M;
};

Fonction booléenne: 3pts


bool estSource(Graphe G, int sommet) {
for (int i=0;i<G.N;i++) {
Bloc *p=G.Tete[i];
while (p!=NULL) {
if (p->val==sommet) return false;
p=p->suiv;
}
}
return true;
}
Parcours de sommets (boucle externe) : 0.5pt
Parcours des successeurs du sommet i (boucle interne) : 1.5pt
Test de recherche de ‘sommet’ avec return false : 0.5pt
return true à l’extérieur des boucles : 0.5pt

Analyse de complexité : 1pt

Boucle externe : O(N) 0.25pt

Boucle interne :
parcours à chaque itération des successeurs d’un sommet. Au pire cas, les successeurs de tous les sommets
seront parcourus ; soit ∑ 𝑑 = 𝑀 0.75pt

Complexité : O(N+M) ou O(M) (-0.5pt si la complexité finale est fausse)

Vous aimerez peut-être aussi