Juin 2010 Page 1/4 Introduction à l’algorithmique et aux langages de programmation —– Examen écrit - INFO0084-2 Samedi 29 mai 2010 Répondez aux questions sur l’énoncé, en y mentionnant vos nom, prénom et matricule. Pour les QCM, il existe toujours au moins une réponse correcte pour chacune des questions. Tous les codes demandés peuvent être remis en pseudo-code ou en métalangage des commandes gardées. Partie 1 : Q.C.M. à réponse unique Bonne réponse : 1 pt ; mauvaise réponse : -0,5 pt ; pas de réponse : 0 pt. Questions 1. Soit une table de hachage M de taux de remplissage α et dont la gestion des collisions s’effectue par un sondage linéaire. Quelle est la probabilité de remplir une alvéole sachant que les i alvéoles précédentes sont occupées ? Réponses α M i M i+1 M α.i M α.M 2. Les variables locales sont allouées explicitement par le programmeur sont allouées sur le tas sont statiques se voient attribuer les adresses mémoire les plus grandes 3. Combien de noeuds possède un arbre complet de n feuilles ? 2n 2n − 1 2n 2n − 1 2n−1 4. On peut dire du tri rapide qu’il est O(n.log(n)) dans le pire des cas O(n.log(n)) dans le cas moyen O(n2 ) dans le cas moyen O(n2 ) dans le meilleur des cas 5. Quel algorithme de tri réalisera le plus petit nombre d’opérations si le tableau fourni en entrée est déjà trié ? le tri par insertion le tri rapide de Hoare le tri rapide de Benteley et McIlroy le tri par tas 6. Quel paradigme de programmation revient à combiner les solutions optimales de sous-problèmes communs par une approche bottom-up ? Diviser pour régner Programmation dynamique Algorithme glouton Recherche exhaustive 7. Parmi les programmes suivants, quel est celui pour lequel la pile serait la structure de données fondamentale ? Un correcteur orthographique Un ordonnanceur de tâches Un opérateur de complétion Un analyseur syntaxique Juin 2010 Page 2/4 Soit l’arbre T ci-dessous. Questions Réponses localement complet 8. Cet arbre est partiellement complet complet aucune de ces propositions équilibré 9. Cet arbre est parfaitement équilibré dégénéré aucune de ces propositions 10. On peut dire du noeud E qu’il est au niveau 1 de profondeur 2 de degré 2 de hauteur 3 11. Le parcours postfixe de l’arbre T est BCDEHJFGKA BDEHJCFGKA BDHJECFKGA HDJBEKFCGA HJDEBKFGCA Questions 12. Soit la portion de code suivante : int sum = 0 ; int limit = n*n*n ; for(int i = 1 ; i < limit ; i *= 2) sum++ ; On peut dire que Réponses Sa complexité est O(log(n)) Sa complexité est O(n.log(n)) Sa complexité est O(n2 ) Sa complexité est O(n3 ) 13. Soit la portion de code suivante : int sum = 0 ; for(int i=0 ; i<n ; i=i+1) for(int j=i ; j>0 ;j−−) sum++ ; On peut dire que Sa complexité est O(log(n)) Sa complexité est O(n.log(n)) Sa complexité est O(n) Sa complexité est O(n2 ) 14. Soit la portion de code suivante : int sum = 0 ; for(int i=0 ; i<n ; i=i+1) for(int j=5 ; j<n ; j=j+j) sum++ ; On peut dire que Sa complexité est O(log(n)) Sa complexité est O(n.log(n)) Sa complexité est O(n) 2 Juin 2010 Page 3/4 Partie 2 : Q.C.M. à réponses multiples possibles Bonne réponse : 1 pt ; mauvaise réponse ou réponse incomplète : -0,5 pt ; pas de réponse : 0 pt. Questions 15. Quelle(s) est(sont) l’(les) assertion(s) correcte(s) ? Réponses n! 5! 3 3 + n est O(n ) 2 2 3n log n + 2n 3 est O(n 3 ) 3n + 2n3 est O(n3 ) 3 2n + 6 log n + 5n 4 est O(n log n) 7 2n log n + n 2 est O(n2 ) 16. Soit la BNF suivante pour la structure conditionnelle en langage ADA if_statement : := "if" condition "then" sequence_of_statements {"elsif" condition "then" sequence_of_statements} ["else" sequence_of_statements] "end if ;" Quelle(s) est(sont) la(les) séquence(s) valide(s) ? if A=B then A := B + 1 ; end if ; 17. Que peut-on dire d’une table de données lorsque l’implémentation est réalisée par des tableaux non ordonnés ? L’opération d’insertion est O(1) if A=B then A := B + 1 ; else A := B ; end if ; if A=B then A := B + 1 ; elsif A=C then A := C + 1 ; elsif A=D then A := D + 1 ; end if ; L’opération d’insertion est O(n) L’opération de recherche est O(1) L’opération de recherche est O(n) L’opération de suppression est O(n) 18. Soit la portion de code suivante, dans un langage compilé inventé, où le “.” désigne l’opérateur de concaténation de chaines : int i ; string s, r ; i = 0; s = “L” ; r = s.i.s ; En sortie, r contient L0L. En se limitant à ces seules informations, comment peut-on qualifier le typage de ce langage ? statique dynamique faible explicite implicite 19. Parmi les list comprehension suivantes, quelle(s) est(sont) l’(les) implémentation(s) fonctionnelle(s) du tri rapide ? 1. 2. def func1(L): if L == []: return [] pivot = L[0] return (func1([x for x in L[:len(L)/2] if x < pivot]) + [pivot] + func1([x for x in L[len(L)/2:] if x >= pivot])) def func2(L): if L == []: return [] pivot = L[0] return (func2([x for x in L[1:] if x <= pivot]) + [pivot] + func2([x for x in L[1:] if x > pivot])) 3. 4. def func3(L): if L == []: return [] pivot = L[-1] return (func3([x for x in L[:L[-1]] if x < pivot]) + [pivot] + def func4(L): if L == []: return [] pivot = L.pop(0) return (func4([x for x in L[1:] if x <= pivot]) + [pivot] + Juin 2010 Page 4/4 Questions à réponses ouvertes 1. Supposons un tableau T [i] de n valeurs classées de façon croissante. On cherche à savoir si une valeur a donnée est présente dans T [i]. (a) Ecrire un algorithme naïf pour la recherche de a. Préciser sa complexité. (b) Ecrire un algorithme de recherche par dichotomie. Préciser sa complexité. Rappel : recherche dichotomique = recherche récursive dans une moitié du tableau 2. Soit l’expression infixée A+B*C-D/E, obéissant à la priorité des opérateurs. (a) Convertir l’expression en arbre. (b) Donner l’expression postfixée équivalente. (c) Soit la structure Noeud et la déclaration de fonction ci-dessous. Noeud data leftchild rightchild fin_Noeud <valeur> <pointeur -> noeud> <pointeur -> noeud> expr_math(Noeud N) : retourne l’expression mathématique (infixée) parenthésée correspondant à l’arbre d’expression de racine N. Fournir l’implémentation de expr_math. Rappel : un arbre d’expression ne contient que les opérateurs et les opérandes. 3. Une liste circulaire est une liste dont le dernier élément de la liste pointe sur le premier de celle-ci. Ecrire, pour une liste circulaire doublement chainée non-vide : (a) l’opération d’insertion d’un élément (b) l’opération de suppression d’un élément