Vous êtes sur la page 1sur 5

Structures de données et algorithms – examen – Nr.

Ex. 1 (6p). Choissez la bonne réponse/les bonnes réponses pour les questions ci-dessous. Chaque question a
0.5p.

1 2 3 4 5 6 7 8 9 10 11 12

1. Vérifiez l’ ADT ou structure des données qui est la plus appropriée pour la problème suivant: vous voulez
construire un carnet d'adresses avec des entrées dans l'ordre alphabétique par nom de famille.
a. Liste triée b.Liste c.Stack/Pille d. Binary Search Tree/arbre binaire de recherce
e. Directed graph / graphe orienté

2. Liste la séquence de noeuds visités par inordre traversal dans l'arbre suivant:

a. ABDGEHICFJ
b. GDBHEIACJF
c. GDHIEBJFCA
d. ABCDEFGHIJ

3. Considérons le graphe orienté suivant. Liste des noeuds dans l'ordre où ils seraient visités dans une recherche
BFS à partir de A. Utiliser l'ordre alphabétique de choisir les voisins, en cas de besoin.

a. ABDEGHJIFC
b. ABCDEFGHIJ
c. ABCDEFGHIJ
d. none/rien

4. Étant donné le tas(heap) suivant, dessinez le tas qui aurait pour


résultat après 2 opérations de suppression.
a.10 11 13 35 42 29 24
b.10 11 13 24 29 35 42
c.5 9 13 11 10 29 24
d. none/rien
5. La colonne de gauche est l'entrée originale de chaînes de caractères à trier; la colonne de
droite est la chaîne dans l'ordre de tri; l’autres colonne est le contenu à une certaine étape
intermédiaire au cours de l'un des algorithmes ci-dessous. Choisissez l'algorithme.
a.Insertion Sort b.Selection Sort c.Quick Sort d.Heap Sort e.none/rien

6. Considérons le tableau d'un max tas suivant (heap):

Insérez le Q clé dans le tas binaire original et choisir le nouveau tas-array.


a.Y W M G U K C A F H P Q
b.Y W M G U Q C A F H P K
c. Y W Q G U M C A F H P K
d.none/rien

7. Un arbre binaire est constitué de nœuds qui sont des instances de la classe suivante:

public class Node { public int val; public Node left; public Node right; }

Considérons la méthode suivante:

Qu'est-ce que la méthode lorsqu'il a adopté une référence au nœud racine d'un arbre binaire?/ What does the
method when passed a reference to the root node of a binary tree?
a.It returns the last node visited by an in-order traversal/ Elle retourne le dernier noeud visité par un parcours in-
ordre
b.It returns the last node visited by a post-order traversal/ Elle retourne le dernier noeud visité par un parcours
post-ordre
c.It returns the last node visited by a level-order traversal/ Elle retourne le dernier noeud visité par un traversal
niveau d'ordre
d.none/rien

8. L'arbre binaire de recherche ci-dessous a été construit en insérant une


séquence d'éléments dans un arbre vide. Laquelle des séquences d'entrée
suivantes ne produira pas cet arbre de recherche binaire?
a. 5 3 4 9 12 7 8 6 20
b. 5 9 3 7 6 8 4 12 20
c. 5 9 7 8 6 12 20 3 4
d. 5 9 7 3 8 12 6 4 20
e. 5 9 3 6 7 8 4 12 20

9. Compte tenu le code ci-dessous, ce qui est la sortie des énoncés suivants?
int arr[] = {5, 19, 6, 12, 48, 6, 23, 39, 2, 18};
int * a2;
a2 = new int [10];
a2=arr;
a2[3] = arr[2];
arr[2] = arr[3];
arr[3] = a2[3];
int *iPtr = arr + 3;
cout<<arr[2]<<" "<<arr[3]<<" "<<*iPtr<<" "<<*(iPtr + 1);

10. Voici un pseudocode INCORRECT pour l'algorithme qui doit déterminer si une séquence de parenthèses est
équilibrée:

Lequel de ces séquences non-


équilibrée sont réputées être
équilibrée par le code?/
Which of these unbalanced
sequences are considered
balanced by the code?
a. ((())
b. ())(()
c. (()()))
d. (()))()

11. Supposons que nous ayons une implémentation de tableau circulaire de la classe de file d'attente( en
commençant par l'index 0), avec dix éléments dans la file d'attente stockées à des données [2] grâce à des
données [11]. La capacité actuelle est de 12. D'où vient la méthode d'insertion placer la nouvelle entrée dans le
tableau?/ Suppose we have a circular array implementation of the queue class (starting with index 0), with ten
items in the queue stored at data[2] through data[11]. The current capacity is 12. Where does the insert method
place the new entry in the array?
a. data[0] b. data[1] c. data[11] d. data[12]

12. Combien de listes liées sont utilisés pour représenter un graphe avec n noeuds et m arêtes, lors de
l'utilisation d'une représentation de la liste?/ How many linked lists are used to represent a graph with n nodes
and m edges, when using an edge list representation?
a. m
b. n
c. m + n
d. m*n

Ex.2. (0.75) Supposons que vous êtes donné l'ensemble des touches suivantes pour insérer dans une table de
hachage qui détient exactement 11 valeurs: 113, 117, 97, 100, 114, 108, 116, 105, 99.
Quel est le contenu de la table après que toutes les touches ont été insérées à l'aide sondage linéaire (linear
probing), puis chaînage?

Ex. 3 (0.75) Une file d'attente de priorité est un type de données abstrait avec un
protocole d'accès intéressante: seul l'élément le plus prioritaire peut être consulté.
Une file d'attente de priorité est mis en œuvre en utilisant un tas. Le tas contient les
éléments suivants.
Quelle est la caractéristique de la chaîne est utilisée pour déterminer leur priorité
dans la file d'attente? Montrer comment cette file d'attente est modifiée après l'ajout
interviewing. Expliquez.

Ex. 4 (1.5p) Considérons la classe suivante, ce qui représente un min tas:


template<typename T> class Heap {
public:
T *H;
int currentDim, maxDim;
Heap(int maxDim) {…}
~Heap() {....}
void insertElement(T x){...}
T peek() {...}
T deleteElement() {...}
void filterUp(int i) {...}
void filterDown(int i) {...}
};
Ecrivez une méthode appelée insertPositionElement dans la classe Heap qui ajoute sur la position j un élément
de type T. La fonction a 2 paramètres : l’élément à insérer et l’index j (pour la position dans le tableau H). Bien
sûr, le nouveau tableau doit rester un min tas.
Dans la fonction main de votre programme C++, créez un objet de type Heap, insérez quelques éléments
et testez votre méthode.
Ex.5. (1.5p) On considère la définition d’une liste linéaire doublement chainée:
template <typename T> struct Noeud {
T info;
Noeud <T> *next;
Noeud <T> *prev;
};

template <typename T> class LinkedList {


public:
Noeud <T> *pfirst;
Noeud <T> *plast;
LinkedList() { …}
void addFirst(T x) { … } // ajoute sur la première position
void addLast(T x) { … } // ajoute sur la dernière position
T getInfo (Noeud<T>* p) {…}
void removeFirst() { … }// supprime la tête
int isEmpty() { …}
void printList() {… }

};

Ecrivez une méthode appelée frontBackSplit dans la classe LinkedList qui sépare une liste donnée dans
deux sous-listes : la première moitié dans la première sous-liste et l’autre dans la deuxième. Si le nombre total
d’éléments de la liste initiale est impaire, l’élément supplémentaire sera mis dans la première sous-liste. Soyez
attentifs aux cas extrêmes ! La méthode doit aussi afficher les éléments des deux sous-listes.

Dans la fonction main de votre programme C++, créez un objet de type LinkedList, insérez quelques
éléments et testez votre méthode.