M1 MEEF SD maths option info
Devoir Surveillé Semestre 1
Ce sujet comporte deux problèmes indépendants ainsi qu’une annexe présentant entre autres un
certain nombre de fonctions utiles à la rédaction des programmes en langage Python.
Lorsqu’il est demandé d’écrire un programme ou un algorithme dans une question, celui-ci devra
systématiquement être rédigé en Python.
Les résultats des questions pourront être réutilisés ainsi que les différentes fonctions demandées non
traitées au cours du problème.
L’usage de la calculatrice est interdit.
1 Systèmes de numération
1.1 Contexte et rappels
Le but de ce sujet est l’étude de différents aspects algorithmiques et théoriques de la représentation
des nombres. Dans tout le sujet, Bdésigne un nombre entier compris entre 2et 10, et est appelé la base
de numération, ou simplement la base.
Habituellement, les nombres entiers compris entre 0et B1sont appelés chiffres en base B, ou
simplement les chiffres.
Soit Σl’ensemble constitué des chiffres en base B. On dit qu’un mot non vide ak. . . a0sur Σreprésente
le nombre entier nNen base Bsi
n=
k
X
i=0
aiBi
Notons qu’il y a une légère ambiguïté de notations. Par exemple, 7est à la fois un nombre, un symbole
de l’alphabet Σ(quand B>8), et un mot sur Σqui représente l’entier 7en toute base B>8. Par
convention, le mot vide représente l’entier zéro. Noter qu’avec la définition donnée ici, plusieurs mots
peuvent représenter le même entier. Par exemple, en base dix, les mots 12,012 et 0000012 représentent
tous le nombre entier douze.
On admet le théorème classique suivant : pour tout entier nN, il existe un unique mot en base
B, appelé la plus petite représentation en base Bde n, ne commençant pas par zéro, et représentant n.
Noter que la plus petite représentation de zéro est le mot vide (en toute base).
On rappelle que si nNet dNsont deux entiers naturels, alors il existe un unique couple d’entiers
naturels (q, r)tel que 06r6d1et n=qd +r. L’entier qest le quotient de npar d, et l’entier rest
le reste dans la division euclidienne de npar d. On définit l’opération modulo, notée mod , par :
nmod d:= r
1.2 Numération avec des chiffres négatifs
Dans cette partie, B= 3, et on définit les chiffres en base Bcomme étant les nombres entiers 0,
1et 1. On remarque donc qu’il y a un chiffre négatif, contrairement aux systèmes de numération
usuels. Soit Σl’alphabet constitué des chiffres en base B. On dit qu’un mot non vide ak. . . a0sur Σ
représente le nombre entier nZen base Bsi
n=
k
X
i=0
aiBi
Par convention, le mot vide représente l’entier zéro. Le chiffre 1sera noté ¯
1pour simplifier l’écriture
et la lecture des mots. Ainsi, le mot 1¯
10¯
1¯
111 représente l’entier 36353332+ 3 + 1 = 454.
1
Pour les algorithmes demandés ci-dessous, la représentation d’un nombre entier sera implémentée
comme une liste Python d’entiers contenant les chiffres. Il est plus commode pour traiter les nombres
de commencer par le dernier chiffre (chiffre des unités), on les stockera donc « de droite à gauche » dans
la liste. Plus précisemment, la représentation ak. . . a0sera stockée dans une liste Ltelle que L[0] =a0,
. . . , L[k] =ak.
Question 1.1 Donner une représentation pour chaque nombre entier de [5,5].
Question 1.2 Montrer que pour tout entier nZ, il existe un unique mot sur Σ, appelé la plus petite
représentation de n, ne commençant pas par zéro, et représentant n.
Donner un algorithme pour calculer les chiffres de la plus petite représentation d’un entier nquel-
conque (cet algorithme peut être utilisé comme preuve d’existence de la décomposition).
1.3 Opérations avec des chiffres négatifs
Pour les quatre questions qui suivent, on demande des algorithmes qui calculent directement à partir
des chiffres de représentations, sur le modèle de l’algorithme d’addition des représentations en base
10 enseigné à l’école primaire. En particuler, il est interdit d’utiliser les fonctions multiplications et
exponentiation du langage, et a fortiori toute fonction plus évoluée. Seules l’addition et les structures de
contrôle élémentaires (tests, boucles, ...) sont autorisées. L’efficacité des algorithmes sera prise en compte
pour la notation.
Question 1.3 Donner un algorithme qui prend en entrée une liste représentant un nombre entier, et
renvoie une liste représentant son opposé.
Question 1.4 Donner un algorithme qui prend en entrée une liste représentant un nombre entier et
renvoie une liste représentant son successeur (le même entier + 1).
Question 1.5 Donner un algorithme qui prend en entrée deux listes représentant deux nombres entiers
et renvoie la représentation de leur somme.
Question 1.6 Donner un algorithme qui prend en entrée deux listes représentant deux nombres entiers
et renvoie la représentation de leur différence.
2 Grands rectangles
Ce problème porte sur la détection de zones rectangulaires monochromatiques dans une image. Ima-
ginons par exemple une image en noir et blanc, le problème est d’en trouver la plus grande zone noire.
Ces zones monochromatiques peuvent être représentées de manière compacte en retenant les cordonnées
des coins et la couleur interne. En décomposant une image selon ces grands rectangles, il est possible
de la compresser efficacement, les zones monochromatiques pouvant être représentées de manière très
compacte.
2.1 Faisabilité
Soit une image de n×npixels noirs ou blancs.
On suppose que cette image contient un rectangle monochromatique de l×hpixels, dont le coin
inférieur gauche est situé au pixel de coordonnées (x, y).
On choisit de ne profiter que de ce rectangle pour compresser l’image. On représentera donc l’image
compressée en deux « temps » :
d’abord, les caractéristiques du rectangle monochromatique ;
puis la suite des pixels n’appartenant pas à ce rectangle, représentés comme d’habitude dans les
images noir et blanc.
Question 2.1 On supposera dans cette partie que les entiers n, l, h, x et ysont représentés sur 2 octets.
Justifier ce choix.
2
Question 2.2 Combien de bits sont nécessaires pour caractériser un rectangle monochromatique ?
En déduire un critère pour savoir s’il est « rentable » de compresser l’image par cette méthode, en
fonction des différentes tailles concernées.
Question 2.3 Que faut-il ajuster si on souhaite utiliser cette méthode de compression sur des images
en niveaux de gris ou en couleurs ?
Donner des exemples d’images sur lesquelles la compression sera efficace, et des exemples sur les-
quelles elle ne permettra pas de réduire la taille de l’image.
2.2 Recherche unidimensionnelle
Dans cette partie, nous allons étudier le problème de reconnaissance de forme sur des tableaux
unidimensionnels (implémentés par des listes Python en l’occurrence). Nous supposerons donnés un
entier net un tableau tab de taille ndont les cases contiennent 0ou 1. Nous supposerons que les indices
du tableau sont compris entre 0et n-1. Le but de cette partie est de trouver le nombre maximal de 0
contigüs (c’est à dire figurant dans des cases consécutives) dans le tableau.
Dans cette partie nous utiliserons le tableau suivant comme exemple :
i 0123456789101112
tab[i] 0011000100 0 1 1
Question 2.4 Écrire une fonction nombreZerosDroite(i, tab) prenant en paramètres le tableau tab
de taille nainsi qu’un indice icompris entre 0et n-1. Cette fonction devra renvoyer le nombre de cases
contigües du tableau contenant 0à droite de la case d’indice i, cette case étant comprise.
D’un point de vue formel il s’agit de renvoyer 0 si la case d’indice icontient un 1 et sinon de renvoyer
max{ji+ 1 tel que i6j < n et k[i, j],tab[k] = 0}
Sur le tableau exemple précédent, en prenant comme indice i=3nous obtenons 0 et pour l’indice i=5
votre fonction devra renvoyer 2. Notez que si la case icontient 1, alors votre fonction devra renvoyer 0.
Il est maintenant possible de réaliser un algorithme de complexité optimale utilisant la fonction
précédente. En voici une brève description. Parcourons le tableau de gauche à droite et à chaque début
de plage de 0 contigüs, nous calculons la taille de cette plage puis repartons juste après elle. Ayant
ainsi calculé la taille de toutes les plages de 0 il suffit de retenir celle de taille maximale. Sur l’exemple
précédent, on part de l’indice 0 qui est un début de plage de 0 de taille 2. Nous continuons donc à
chercher le prochain début de plage à partir de l’indice 0 + 2 = 2. On examine ensuite l’indice 3 qui
contient encore un 1 puis arrivons à l’indice 4 qui est le début d’une plage de 0 de taille 3. Nous allons
donc chercher le prochaine début de plage à partir de l’indice 4 + 3 = 7 etc.
Question 2.5 Écrire une fonction nombreZerosMaximum(tab) qui renvoie le nombre maximal de 0
contigüs en utilisant l’algorithme précédent. On attachera une attention particulière à ce que l’algorithme
produit soit de complexité linéaire c’est à dire en temps O(n).
2.3 De la 1D vers la 2D
Cette partie consiste à développer un algorithme efficace pour détecter un rectangle d’aire maximale
rempli de 0 dans un tableau bidimensionnel. Par mesure de simplification, nous travaillerons sur des
tableaux carrés et nous supposerons donné un tableau tab2 de taille n×n. Un tableau bidimensionnel
sera adressé par tab2[i][j] et ireprésentera le numéro de ligne dans nos exemples.
Nous utiliserons le tableau suivant comme exemple :
3
i\j 01234567
000110001
100001001
210000001
301000001
400110001
500100001
601110101
700110001
Méthode naïve La première méthode proposée consiste à prendre une cellule (i,j) et à trouver
un rectangle d’aire maximale dont le coin inférieur gauche est cette cellule. Remarquez que suivant
l’orientation donnée dans le tableau exemple ci-dessus, un rectangle d’aire maximale de coin inférieur
gauche la cellule (i,j) aura comme coin supérieur droit la cellule (i’,j’) avec i’ 6iet j’ >j. Par
exemple, un rectangle d’aire maximale de coin inférieur gauche la cellule (i,j) = (3, 2) aura comme coin
supérieur droit la cellule de coordonnées (2, 6).
Question 2.6 Écrire une fonction rectangleHautDroit(tab2, i, j) qui renvoie l’aire d’un rectangle
d’aire maximale rempli de 0 et de coin inférieur gauche (i,j). On cherchera la solution la plus efficace
possible. Pour i=3et j=2sur le tableau exemple ci-dessus, la fonction devra renvoyer la valeur 10.
Question 2.7 Expliquer comment trouver naïvement un rectangle d’aire maximale rempli de 0 en uti-
lisant la fonction rectangleHautDroit. Quelle serait la complexité de cette approche en fonction de
n?
Un peu de précalcul Notre algorithme parcourt de nombreuses fois les même cases afin de vérifier la
présence d’un 0 ou d’un 1. Nous allons donc effectuer avant notre algorithme un précalcul de certaines
valeurs ce qui nous permettra, dans la partie 2.4, d’accélérer les fonctions précédentes.
Pour chaque cellule (i,j), nous allons calculer le nombre ci,j de cellules contigües contenant 0 au
dessus de la cellule (i,j), cette dernière étant comprise. Ce nombre est tel que les cellules (i,j),(i
1,j),...,(ici,j + 1,j)contiennent 0 et la cellule (ici,j ,j)contient 1 ou bien cette cellule n’existe
pas. Ces valeurs ci,j seront rangées dans un tableau col. Le tableau col suivant est obtenu à partir du
tableau exemple.
i\j 01234567
011001110
122110220
203221330
310332440
421003550
532014660
640005070
751006180
Question 2.8 Écrire une fonction colonneZeros(tab2) qui renvoie un tableau bidimensionnel d’entiers
col de taille n×net tel que col[i][j] donne le nombre de cellules contigües contenant 0 au dessus de
(i,j), cette cellule étant comprise. On apportera un soin particulier à programmer la fonction la plus
rapide possible.
Question 2.9 Quelle est la complexité de la fonction colonneZeros ?
4
2.4 Algorithme optimisé
Rectangle d’aire maximale dans un histogramme Une nouvelle étape dans notre algorithme
réside dans la résolution du problème du calcul d’un rectangle d’aire maximale inscrit dans un histo-
gramme. Nous supposerons donné un histogramme c’est à dire un tableau histo de taille n contenant
des entiers. Chaque valeur représentera la hauteur d’une barre de l’histogramme. Par exemple le tableau
suivant est associé à l’histogramme à sa droite.
i 01234567
histo[i] 31242201
L’idée est de calculer un indice L[i] pour chaque colonne i, tel que L[i] est le plus petit entier j
satisfaisant : 06j6iet histo[k]>histo[i], pour tout ktel que j6k6i.
Notons que 0 6L[i] 6i. Dans notre exemple nous aurons L[2] = 2 car la colonne 1 est strictement
plus petite que la colonne 2. Nous aurons par ailleurs L[5] = 2 car les trois valeurs histo[2],histo[3]
et histo[4] sont toutes >histo[5] mais histo[1] <histo[5].
Nous pourrions calculer les valeurs L[i] de manière naïve mais cela ne permettrait pas d’améliorer
notre algorithme. Nous allons donc procéder autrement.
On calcule successivement les valeurs de L[i] pour i=0. . . n 1. Pour calculer L[i] on pose j=
iet on fait décroître jtant que les colonnes sont plus grandes de la manière suivante :
Répéter :
Si j= 0 alors affecter L[i] = 0 et terminer.
Sinon :
Si histo[j - 1] <histo[i] alors affecter L[i] =jet terminer.
Sinon histo[j - 1] >histo[i] alors affecter j=L[j - 1] et continuer.
Question 2.10 Montrer que l’algorithme précédent calcule correctement les valeurs de L. De plus, mon-
trer que l’algorithme fonctionne un temps proportionnel à nsur le cas particulier du tableau
histo = [1, 2, 3, ... , n - 1, n, n, n - 1, ... , 1] de taille 2n.
On supposera donnée une fonction calculeL(histo) qui renvoie en temps O(n)le tableau Lde taille
ntel que L[i] est l’indice défini précédemment. On supposera aussi donnée une fonction équivalente
calculeR(histo) qui renvoie en temps O(n)un tableau Rdont les valeurs R[i] >iqui de manière
analogue est l’indice maximal tel que histo[k]>histo[i] pour tout ktel que i6k6R[i].
Question 2.11 Justifier que pour tout i, le rectangle commençant à l’indice L[i], terminant à l’indice
R[i] et de hauteur histo[i] est inclus dans l’histogramme.
Question 2.12 Soit un rectangle d’aire maximale inscrit dans l’histogramme. Supposons que ce rectangle
commence à l’indice l, termine à l’indice r, et a pour hauteur h. Montrer qu’il existe i[l . . . r]tel que
histo[i] =h,L[i] =l, et R[i] =r.
Question 2.13 En déduire une fonction plusGrandRectangleHistogramme(histo) qui calcule et ren-
voie l’aire d’un plus grand rectangle inscrit dans l’histogramme. Donner la complexité de votre fonction
plusGrandRectangleHistogramme.
2.5 Conclusion
En revenant au problème initial du calcul d’un rectangle de 0 d’aire maximale dans une matrice en
deux dimensions, remarquer que chaque ligne du tableau col calculé par la fonction colonneZeros de la
question 2.8 peut être interprétée comme un histogramme.
En utilisant cette analogie, il est possible de proposer une méthode efficace de résolution du problème.
Question 2.14 Écrire la fonction rectangleToutZero(tab2) qui calcule un rectangle d’aire maximale
rempli de 0 dans le tableau tab2 et renvoie son aire.
Question 2.15 Quelle est la complexité de votre fonction ?
5
1 / 6 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 !