Devoir surveillé no 2 2 heures Aucun document n’est autorisé. L’usage de la calculatrice est interdit. *** Ce devoir étudie deux représentations des ensembles (au sens mathématique) dans python : par des listes dans la partie I et par des nombres (écrit en binaire) dans la partie II. On rappelle qu’un ensemble ne peut pas contenir de doublon (c’est à dire plusieurs fois le même élément). On dit qu’un ensemble E est inclus dans E 0 , et on note E ⊆ E 0 , si tous les éléments de E sont aussi des éléments de E 0 . L’intersection E ∩ E 0 de E et E 0 est l’ensemble constitué des éléments qui sont dans E et dans E 0 . L’union E ∪ E 0 de E et E 0 est l’ensemble constitué des éléments qui sont dans E ou dans E 0 . Toutes les complexités seront exprimées dans le pire des cas, sous la forme O(...) et devront être justifiées. I Représentation par des listes Dans cette partie, on représente un ensemble par une liste. Par exemple, l’ensemble {0, 2, 3} est représenté par la liste [0, 2, 3]. 1. Écrire une fonction card ayant une liste en argument et renvoyant le nombre de ses éléments. 2. Écrire une fonction appartient telle que appartient(k, L) renvoie True si k appartient à la liste L, False sinon. 3. (a) Écrire une fonction min renvoyant le minimum d’une liste non vide en argument. (b) Prouvez que min renvoie bien le minimum d’une liste non vide. (c) Quelle est sa complexité dans le pire des cas, en fonction de la taille n de L ? (d) Sur un ordinateur avec la configuration suivante, estimer le temps d’exécution de min(L), si L est une liste de taille 106 . Type du processeur Fréquence processeur Quantité de mémoire RAM Capacité disque dur 64 bits 2 GHz 4 Go 256 Go 4. (a) Écrire une fonction est_ens ayant une liste L en argument et renvoyant True si la liste représente un ensemble, False sinon. Il faut déterminer si L contient un doublon. 1 (b) Quelle est la complexité dans le pire des cas de est_ens, en fonction de la taille n de L ? (c) Estimer, pour la configuration précédente, le temps d’exécution de est_ens(L) si L est de taille 106 . 5. (a) Écrire une fonction inter telle que, si L1 et L2 sont des listes représentant des ensembles, inter(L1, L2) renvoie la liste représentant leur intersection. (b) Quelle est la complexité dans le pire des cas de inter, en fonction des tailles n1 et n2 de L1 et L2 ? 6. Écrire une fonction union telle que, si L1 et L2 sont des listes représentant des ensembles, union(L1, L2) renvoie la liste représentant leur union. II Représentation binaire Dans cette partie, on fixe n ∈ N et En = {0, 1, ..., n − 1}. On représente un ensemble S inclus dans En par un entier positif dont l’écriture en base 2 sur n bits possède un 1 en position i ∈ {0, 1, ..., n − 1} si et seulement si i ∈ S. Par exemple, si n = 5, S = {0, 2, 3} ⊆ E5 est représenté par le nombre 13, car : < 01101 >2 = 20 + 22 + 23 = 13 1. Quel entier représente ∅ ? On donnera ses écritures binaire et décimale. 2. Quel entier représente En ? On donnera ses écritures binaire et décimale. 3. Quel entier représente {k}, si k ∈ En ? On donnera ses écritures binaire et décimale. 4. En supposant n = 5, quel ensemble est représenté par le nombre 26 ? Si a et b sont des entiers positifs écrit en base 2 sur n bits, on peut leur appliquer les opérations élémentaires & et | suivantes en python : • a & b est un entier positif dont l’écriture en base 2 a son ième bit égal à 1 si et seulement si les ièmes bits de a et b sont 1. • a | b est un entier positif dont l’écriture en base 2 a son ième bit égal à 1 si et seulement si le ième bit de a ou b est égal à 1. Par exemple, comme 6 = < 110 >2 et 3 = < 011 >2 , 6 & 3 renvoie 2 (= < 010 >2 ) et 6 | 3 renvoie 7 (= < 111 >2 ). 5. Si a et b sont des entiers positifs représentant des ensembles A et B, quel ensemble représente a & b ? Même question pour | au lieu de &. Indice : penser aux opérations classiques sur les ensembles. 6. Écrire deux fonction inter2 et union2 prenant chacune deux entiers positifs a et b, représentant des ensembles A et B, et renvoyant les entiers représentant A ∩ B et A ∪ B, respectivement. Quel intérêt a la représentation binaire des ensembles, par rapport à la représentation par liste ? 2 7. Écrire une fonction appartient2 telle que appartient2(k, a) renvoie True si k appartient à l’ensemble A représenté par l’entier positif a, False sinon. Indice : k ∈ A ⇐⇒ {k} ∩ A 6= ∅. 8. Écrire une fonction card2 telle que card2(a) renvoie la taille de l’ensemble représenté par l’entier positif a. On rappelle que le codage par complément à 2 sur p bits consiste à stocker tous les nombres n de −2p−1 à 2p−1 − 1 : • Si n ≥ 0, n est codé par son écriture en base 2. • Si n < 0, le codage de n est obtenu de la façon suivante : 1. Écrire −n en base 2. 2. Inverser les 0 et les 1. 3. Ajouter 1. 9. Donner le codage par complément à 2 de -26 sur 6 bits. 10. Quels ensembles représentent 26 et 26 & -26 ? 11. En déduire une fonction efficace pour calculer le minimum d’un ensemble représenté par un entier. Comparer avec la fonction min de la partie I. 3