Année Universitaire 2013/2014 DST de Printemps



Documents pareils
Licence Sciences et Technologies Examen janvier 2010

Les arbres binaires de recherche

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Les structures de données. Rajae El Ouazzani

1 Recherche en table par balayage

ARBRES BINAIRES DE RECHERCHE

Représentation d un entier en base b

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Architecture des Systèmes d Information Architecture des Systèmes d Information

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Définitions. Numéro à préciser. (Durée : )

Année Universitaire 2009/2010 Session 2 de Printemps

INF601 : Algorithme et Structure de données

Initiation à l algorithmique

V- Manipulations de nombres en binaire

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

STAGE IREM 0- Premiers pas en Python

Algorithmique et structures de données I

Recherche dans un tableau

Continuité et dérivabilité d une fonction

Algorithmique et Programmation, IMA

Introduction à l informatique en BCPST

CCP PSI Mathématiques 1 : un corrigé

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Arbres binaires de recherche

Rappels sur les suites - Algorithme

MIS 102 Initiation à l Informatique

Algorithmes récursifs

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Seconde Généralités sur les fonctions Exercices. Notion de fonction.

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

Initiation à la programmation en Python

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

La mémoire. Un ordinateur. L'octet. Le bit

Algorithmique, Structures de données et langage C

Développement décimal d un réel

Quelques Algorithmes simples

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Algorithmique I. Algorithmique I p.1/??

Commun à tous les candidats

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Limites finies en un point

Leçon 01 Exercices d'entraînement

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

Solutions en ligne Guide de l utilisateur

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Image d un intervalle par une fonction continue

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

chapitre 4 Nombres de Catalan

Utilisation d objets : String et ArrayList

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Programmation C++ (débutant)/instructions for, while et do...while

ASR1 TD7 : Un microprocesseur RISC 16 bits

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

Chapitre 7. Récurrences

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

TP 1. Prise en main du langage Python

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

Chapitre 7 : Intégration sur un intervalle quelconque

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Compression de Données - Algorithme de Huffman Document de Conception

L ARBORESCENCE. Qu est-ce qu un dossier? L arborescence?

Quelques algorithmes simples dont l analyse n est pas si simple

Découverte de Python

L exclusion mutuelle distribuée

Jean-Philippe Préaux

Intégration et probabilités TD1 Espaces mesurés Corrigé

Corrigé des exercices sur les références

Chapitre V : La gestion de la mémoire. Hiérarchie de mémoires Objectifs Méthodes d'allocation Simulation de mémoire virtuelle Le mapping

Organiser les informations ( approche technique )

Corrigé des TD 1 à 5

Baccalauréat ES/L Métropole La Réunion 13 septembre 2013 Corrigé

EXCEL TUTORIEL 2012/2013

Chp. 4. Minimisation d une fonction d une variable

C f tracée ci- contre est la représentation graphique d une

Algorithmique et Programmation

Cours de Systèmes d Exploitation

Cours d Analyse. Fonctions de plusieurs variables

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Chapitre 2 Le problème de l unicité des solutions

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Le chiffre est le signe, le nombre est la valeur.

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr


Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

Diviser un nombre décimal par 10 ; 100 ; 1 000

Cours d initiation à la programmation en C++ Johann Cuenin

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Transcription:

Année Universitaire 2013/2014 DST de Printemps Parcours : Licence LIMI201 & LIMI211 Code UE : J1MI2013 Épreuve : Algorithmes et Programmes Date : Lundi 16 juin 2014 Heure : 16 heures 30 Durée : 2 heures Documents : non autorisés Épreuve de M. Alain Griffault Collège Sciences et Technologies SUJET + CORRIGE Avertissement À chaque question, vous pouvez au choix répondre par un algorithme ou bien par un programme python. Les indentations des fonctions écrites en Python doivent être respectées. L espace laissé pour les réponses est suffisant (sauf si vous utilisez ces feuilles comme brouillon, ce qui est fortement déconseillé). Question Points Score Le tri par tas 28 Suite de Padovan 12 Total: 40 Exercice 1 : Le tri par tas Le but de l exercice est l écriture d un algorithme de tri de tableaux basé sur la notion de tas. Les questions se suivent logiquement, mais beaucoup sont indépendantes. (a) Des fonctions élémentaires pour se déplacer dans un tableau. (28 points) [0] : 5 [1] : 2 [3] : 0 [5] : 9 [6] : 1 indice 0 1 2 3 4 5 6 7 T[indice] 5 2 6 0 1 9 1 5 [7] : 5 (a) Vision tabulaire (b) Vision arborescente Figure 1 Deux vues différentes d un même tableau La figure 1 montre qu un même tableau peut être dessiné avec des cases contiguës, ou bien avec des cases dispersées dans une arborescence. Avec la vue contiguë, on utilise généralement une variable i qui parcourt les indices du tableau. Avec la vue arborescente, on peut évidemment utiliser une variable i qui parcourt les indices du tableau, mais on utilise également trois fonctions qui permettent de suivre les liens bidirectionnels (réels ou virtuels) de l arborescence : gauche(indice) représente les liens pointillé du haut vers le bas de l arborescence. Par exemple, dans la figure 1b, gauche(1)=3, gauche(4)=9 et gauche(2)=5. droite(indice) représente les liens en trait plein du haut vers le bas de l arborescence. Par exemple, dans la figure 1b, droite(1)=4, droite(3)=8 et droite(0)=2. pere(indice) représente les liens du bas vers le haut de l arborescence. Par exemple, dans la figure 1b, pere(4)=1, pere(7)=3 et pere(2)=0. Par contre pere(0) n est pas défini, et sa valeur (null,-1,0,...) importe peu car jamais utilisée dans cet exercice.

Voici un algorithme et un programme Python, de complexités en temps et en espace de Θ(1), possibles pour la fonction gauche(indice). Gauche(i){ retourner 2*i+1; } def gauche ( i ) : return 2 i +1 i. (1 point) Écrire un programme Python ou un algorithme droite(i) qui retourne un entier d tel qu il existe un lien en trait plein du haut vers le bas reliant les indices i à d. Les complexités en temps et en espace doivent être en Θ(1). def d r o i t e ( i ) : return 2 ( i +1) ii. (1 point) Écrire un programme Python ou un algorithme pere(i) qui retourne un entier p tel qu il existe un lien du bas vers le haut reliant les indices i à p. Les complexités en temps et en espace doivent être en Θ(1). def pere ( i ) : return ( i 1)//2 (b) Construction d un tas à partir d un tableau. Définition 1 Un tas est un tableau d entiers tel que pour tous les indices i strictement positifs, la valeur de T[i] est inférieure ou égale à celle de T[pere(i)] Le but de cette partie de l exercice est d effectuer la transformation représentée par la figure 2. [0] : 5 [0] : 9 [1] : 2 [3] : 0 [5] : 9 [6] : 1 [5] : 5 [6] : 1 [7] : 5 (a) Vue arborescente du tableau initial (b) Tas obtenu par construction Figure 2 Construction d un tas i. (3 points) Écrire un programme Python ou un algorithme estuntas(t) qui retourne Vrai si le tableau T est un tas, Faux sinon. La complexité en temps doit être en Ω(1), O(n) avec n = longueur(t ), et celle en espace doit être en Θ(1). def estuntas (T) : for i in range ( 1, l e n (T ) ) : i f T[ pere ( i )] <T[ i ] : return F a l s e return True ii. (3 points) Avec les hypothèses 0 i<limite et limite longueur(t), écrire un programme Python ou un algorithme maximum(t,i,limite) qui retourne : (imax < limite) (imax {i, gauche(i), droite(i)}) T[iMax] T[i] le plus petit entier imax tel que gauche(i) < limite T[iMax] T[gauche(i)] droite(i) < limite T[iMax] T[droite(i)] Page 2 sur 7

En d autres termes, maximum(t,i,limite) retourne l indice (inférieur à limite) de la plus grande des trois valeurs T[i], T[gauche(i)] et T[droite(i)]. En cas de valeurs égales, le plus petit indice est retourné. Par exemple sur la figure 2a, maximum(t,0,8)=2, maximum(t,2,8)=5, maximum(t,3,8)=7 et maximum(t,3,7)=3. Les complexités en temps et en espace doivent être en Θ(1). def maximum(t, i, l i m i t e ) : a s s e r t (0<= i and i <l i m i t e and l i m i t e <=l e n (T) ) imax = i g = gauche ( i ) d = d r o i t e ( i ) # maximum e n t r e T[ i ], T[ g ] e t T[ d ] avec g e t d < l i m i t e i f g<l i m i t e and T[ g]>t[ imax ] : imax = g i f d<l i m i t e and T[ d]>t[ imax ] : imax = d return imax iii. (1 point) Soit la fonction récursive Python suivante def e n t a s s e r R e c u r s i f (T, i, l i m i t e ) : imax = maximum(t, i, l i m i t e ) i f imax!= i : echange (T, i, imax ) e n t a s s e r R e c u r s i f (T, imax, l i m i t e ) avec def echange (T, i, j ) : aux = T[ i ] T[ i ] = T[ j ] T[ j ] = aux Compléter l arborescence avec les valeurs du tableau après l appel entasserrecursif(t,0,8) Solution : [0] : 5 [0] : 9 [2] : 9 [5] : 6 [6] : 1 [5] : 5 [6] : 1 (a) Avant entasser (b) Après entasser Figure 3 Entasser(T,0,8) iv. (3 points) La fonction entasserrecursif(t,i,limite) est récursive terminale. Écrire un programme Python ou un algorithme itératif entasser(t,i,limite) équivalent. def e n t a s s e r (T, i, l i m i t e ) : imax = maximum(t, i, l i m i t e ) while imax!= i : echange (T, i, imax ) i = imax imax = maximum(t, i, l i m i t e ) v. (1 point) Donner les complexités en temps et en espace (meilleur des cas et pire des cas) de votre algorithme entasser(t,i,limite). Page 3 sur 7

Les complexités sont : en temps en Ω(1), O(log 2 (n)) avec n = longueur(t ), vi. (4 points) L algorithme entasser(t,i,limite) échange des valeurs du tableau de haut en bas, en suivant une branche de l arborescence. Cela a pour effet de faire descendre des petites valeurs, et de faire monter les grandes valeurs. Il est donc possible de construire un tas, en itérant cet algorithme sur les indices décroissants du tableau. En utilisant entasserrecursif(t,i,limite) ou entasser(t,i,limite), écrire un programme Python ou un algorithme construiretas(t) qui transforme un tableau en un tas. def c o n s t r u i r e T a s (T) : #f o r i in range ( l e n (T) 1, 1, 1): peut e t r e o p t i m i s e en for i in range ( ( l e n (T) 1)//2, 1, 1): e n t a s s e r (T, i, l e n (T) ) vii. (1 point) Donner les complexités en temps et en espace (meilleur des cas et pire des cas) de votre algorithme construiretas(t). Si l on utilise l algorithme itératif pour entasser, les complexités sont : en temps en Ω(n) si T est déjà un tas, O(n log 2 (n)) avec n = longueur(t ), (c) Tri d un tas. Le but de cette partie de l exercice est d effectuer la transformation représentée par la figure 4. [0] : 9 [0] : 0 [1] : 1 [2] : 1 [5] : 5 [6] : 1 [4] : 5 [5] : 5 [6] : 6 [7] : 9 (a) Tas initial (b) Vue arborescente du tableau trié Figure 4 Tri d un tas i. (4 points) Dans un tas, la valeur maximale est à la racine de l arborescence, donc en T[0]. Dans le tableau trié, cette valeur doit être en T[len(T)-1]. Il suffit donc d échanger ces deux valeurs pour progresser vers la solution. Une fois cette échange fait, si l on exclut la dernière valeur du tableau, le tas est peu changé. En fait entasser(t,0,len(t)-1) va créer un nouveau tas pour les valeurs du tableau dont les indices sont inférieurs à limite = len(t)-1. Il suffit donc d itérer ces deux étapes (échange, entasser) pour trier un tas. Écrire un programme Python ou un algorithme triertas(t) qui transforme un tas en un tableau trié en ordre croissant. def t r i e r T a s (T) : for i in range ( l e n (T) 1,0, 1): echange (T, 0, i ) e n t a s s e r (T, 0, i ) Page 4 sur 7

ii. (1 point) Donner les complexités en temps et en espace (meilleur des cas et pire des cas) de votre algorithme triertas(t). Si l on utilise l algorithme itératif pour entasser, les complexités sont : en temps en Ω(n) si toutes les valeurs de T sont égales, O(n log 2 (n)) avec n = longueur(t ), (d) Tri d un tableau à l aide de tas. i. (3 points) Écrire un programme Python ou un algorithme tripartas(t) qui trie un tableau d entiers T en construisant d abord un tas, puis en le triant. def tripartas (T) : c o n s t r u i r e T a s (T) t r i e r T a s (T) ii. (1 point) Donner les complexités en temps et en espace (meilleur des cas et pire des cas) de votre algorithme tripartas(t). Si l on utilise l algorithme itératif pour entasser, les complexités sont : en temps en Ω(n) si toutes les valeurs de T sont égales, O(n log 2 (n)) avec n = longueur(t ), iii. (1 point) Votre algorithme tripartas(t) effectue t-il un tri stable? Justifier. Non, car il effectue des échanges de valeurs avec des indices non consécutifs. Exercice 2 : Suite de Padovan La suite (ou fonction) de Padovan d un entier naturel est définie par : P adovan(n) = 1 si n = 0 1 si n = 1 1 si n = 2 P adovan(n 2) + P adovan(n 3) sinon (12 points) (a) i. (3 points) Écrire un programme Python ou un algorithme récursif padovanrecursif(n) qui retourne la valeur P adovan(n). def padovanrecursif ( n ) : a s s e r t (n>=0) i f n<3: return 1 else : return padovanrecursif (n 2) + padovanrecursif (n 3) ii. (1 point) Dessiner l arbre des appels récursifs lors de l appel padovanrecursif(7). Page 5 sur 7

pad(1) : 1 pad(0) : 1 pad(3) : 2 pad(2) : 1 pad(2) : 1 pad(1) : 1 pad(5) : 3 pad(4) : 2 pad(7) : 5 iii. (1 point) En interprétant l arbre des appels récursifs et notamment la longueur de ses branches, donner un encadrement du nombre d appels récursifs, pour en déduire la complexité (temps et espace) de votre algorithme récursif. La plus longue branche (la plus à gauche) de l arbre des appels a une longueur de n/2. Le nombre d appels est donc inférieur à 2 n/2 La plus courte branche (la plus à droite) de l arbre des appels a une longueur de n/3. Le nombre d appels est donc supérieur à 2 n/3 La complexité : en temps est comprise entre Ω( 3 2 n ) et O( 2 n ). en espace est de Θ(n). non demandé : La complexité en temps est en Θ(ψ n ) avec ψ dénommé le nombre plastique, qui est l unique solution réelle de X 3 = X + 1, et environ égal à 1, 3247179572. (b) (4 points) Par analogie avec la fonction Fibonacci(n) vue en cours, il est possible de transformer cette fonction récursive en une fonction récursive terminale. Pour cela, il faut ajouter trois paramètres qui contiennent trois valeurs consécutives de la suite. A chaque appel récursif : deux sont modifiés par décalage, le troisième est obtenu par l addition de deux parmi les trois. Écrire un programme Python ou un algorithme récursif terminal padovanrecterminal(n,u,v,w) qui retourne la valeur P adovan(n), et préciser l appel initial. def padovanrecterminal ( n, u=1, v=1, w=1): a s s e r t (n>=0) i f n==0: return u e l i f n==1: return v e l i f n==2: return w else : return padovanrecterminal ( n 1,v, w, v+u ) (c) i. (2 points) Transformer automatiquement votre solution récursive terminale, afin d obtenir un programme Python ou un algorithme itératif padovaniteratif(n) qui retourne la valeur P adovan(n). def padovaniteratifautomatique ( n ) : a s s e r t (n>=0) u=1 v=1 w=1 while True : i f n==0: return u e l i f n==1: return v Page 6 sur 7

e l i f n==2: return w else : # n, u, v,w = n 1,v, w, v+u n = n 1 aux = u u = v v = w w = u+aux ii. (1 point) Donner les complexités en temps et en espace (meilleur des cas et pire des cas) de votre solution itérative. La complexité : en temps est en Θ(n), en espace est en Θ(1). Page 7 sur 7