EÌtude de trafic routierâïž
Quelques remaques
- L'égalité se teste avec
==pas=. - Une liste Python ni ne renvoie, ni ne retourne des éléments (c'est les fonctions qui retournent...). Une liste contient des éléments.
- Si on veut tester un seul élément d'une liste, il ne faut pas utiliser de boucle (question 3).
- Les complexitĂ©s temporelles affirmĂ©es doivent ĂȘtre justifiĂ©es. Effectuer n itĂ©ration sur un boucle ne suffit pas Ă avoir un complexitĂ© en \(\mathcal{O}(n)\), il faut en plus que chaque itĂ©ration se fasse en \(\mathcal{O}(1)\) (c'est Ă dire un nombre fixe d'instructions Ă©lĂ©mentaires).
- Ăviter les
pop()au sein d'une boucleforsur les indices de l'itérable. En lepopva décaler les éléments suivants et il est possible d'avoir des erreursout of range. Si besoin, on peut s'en sortir en itérant avec des indices décroissants (range(len(l) - 1, - 1, 0)). - Les tranches (slice) de listes (ex.
l[a:b],l[:b],l[a:],l[b:a:-1],l[:],l[::-1]) sont Ă connaitre. Elles peuvent ĂȘtre trĂšs utiles dans ce sujet pour copier une tranche de liste.
Partie I. PrĂ©liminairesâïž
Q1 â Expliquer comment repreÌsenter une file de voitures aÌ lâaide dâune liste de booleÌens.
Une liste Python permet de rerpésenter une file de voiture, modélisées par des cases.
Une liste de booléens indique si une voiture est présente ou non dans chaque case.
Q2 â Donner une ou plusieurs instructions Python permettant de deÌfinir une liste A repreÌsentant la file de voitures illustreÌe par la Figure 1(a).
A = [True,False] + [True] * 2 + [False] * 6 + [True]
Q3 â Soit L une liste repreÌsentant une file de longueur n et i un entier tel que \(0 \le i \le n\). DeÌfinir en Python la fonction occupe(L, i) qui renvoie True lorsque la case dâindice i de la file est occupeÌe par une voiture et False sinon.
Q4 â Combien existe-t-il de files diffĂ©rentes de longueur n ? Justifier votre rĂ©ponse.
Chaque case est occupée de façon indépendante des autres, il y a deux choix par case et donc \(2^n\) files différentes de longueur \(n\).
Q5 â EÌcrire une fonction egal(L1, L2) retournant un booleÌen permettant de savoir si deux listes L1 et L2 sont eÌgales.
| Python | |
|---|---|
Ou en utilisant l'égalité sur les listes
Q6 â Que peut-on dire de la complexiteÌ de cette fonction ?
Avec le premier code, on constate la compléxité linéaire de l'algorihtme. En effet, le nombre d'itérations de la boucle est égal à la longueur des listes et pour chaque itératione une compraraison en \(\mathcal{O}(1)\) est effectuée.
remarque non attendue dans les copies de concours si la comparaison n'est pas d'une complexitĂ© de \(\mathcal{O}(1)\), comme c'est le cas quand L1 et L2 sont des structures imbriquĂ©es par exemple liste de listes, la complexitĂ© globale est alors Ă©gale Ă \(n\cdot\mathcal{O}(c(n))\) oĂč \(c(n)\) est une fonction qui indique la complexitĂ© des comparaisons en fonction de la taille \(n\) des entrĂ©es.
Q7 â PreÌciser le type de retour de cette fonction.
Elle retourne un booléen.
Partie II. DeÌplacement de voitures dans la fileâïž
Q8 â EÌtant donneÌe A la liste deÌfinie aÌ la question 2, que renvoie `avancer(avancer(A, False),True)Ì
avancer(A, False) retourne [False, True, False, True, True, False, False, False, False, False, False]. Et cette liste est utilisée en premier argument de avancer avec Trueen deuxiÚme argument.
avancer(avancer(A, False),True) retourne donc [True, False, True, False, True, True, False, False, False, False, False].
Q9 â On consideÌre L une liste et m lâindice dâune case de cette liste (\(0 \le m < len(L)\)). On s'inteÌresse aÌ une eÌtape partielle ouÌ seules les voitures situeÌes sur la case dâindice m ou aÌ droite de cette case peuvent avancer normalement, les autres voitures ne se deÌplaçant pas.
DeÌfinir en Python la fonction avancer_fin(L, m) qui reÌalise cette eÌtape partielle de deÌplacement et renvoie le reÌsultat dans une nouvelle liste sans modifier L.
| Python | |
|---|---|
Q10 â Soient L une liste, b un booleÌen et m lâindice dâune case inoccupeÌe de cette liste.
On consideÌre une eÌtape partielle ouÌ seules les voitures situeÌes aÌ gauche de la case dâindice m se deÌplacent, les autres voitures ne se deÌplacent pas. Le booleÌen b indique si une nouvelle voiture est introduite sur la case la plus aÌ gauche.
DeÌfinir en Python la fonction avancer_debut(L, b, m) qui reÌalise cette eÌtape partielle de deÌplacement et renvoie le reÌsultat dans une nouvelle liste sans modifier L.
| Python | |
|---|---|
Q11 â On consideÌre une liste L dont la case dâindice \(m > 0\) est temporairement inaccessible et bloque lâavanceÌe des voitures. Une voiture situeÌe immeÌdiatement aÌ gauche de la case dâindice m ne peut pas avancer. Les voitures situeÌes sur les cases plus aÌ gauche peuvent avancer, aÌ moins dâeÌtre bloqueÌes par une case occupeÌe, les autres voitures ne se deÌplacent pas. Un booleÌen b indique si une nouvelle voiture est introduite lorsque cela est possible.
DeÌfinir en Python la fonction avancer_debut_bloque(L, b, m) qui reÌalise cette eÌtape partielle de deÌplacement et renvoie le reÌsultat dans une nouvelle liste.
Partie III. Une eÌtape de simulation aÌ deux filesâïž
Q12 â En utilisant le langage Python, deÌfinir la fonction avancer_files(L1, b1, L2, b2) qui renvoie le reÌsultat dâune eÌtape de simulation sous la forme dâune liste de deux eÌleÌments noteÌe [R1, R2] sans changer les listes L1 et L2. Les booleÌens b1 et b2 indiquent respectivement si une nouvelle voiture est introduite dans les files L1 et L2. Les listes R1 et R2 correspondent aux listes apreÌs deÌplacement.
Q13 â On consideÌre les listes D = [ False, True, False, True, False], E = [False, True, True, False, False]
Que renvoie lâappel avancer_files(D, False, E, False) ?
La valeur retournée est : [[False, False, True, False, True], [False, True, False, True, False]]
Partie IV. Transitionsâïž
Q14 â En consideÌrant que de nouvelles voitures peuvent eÌtre introduites sur les premieÌres cases des files lors dâune eÌtape de simulation, deÌcrire une situation ouÌ une voiture de la file L2 serait indeÌfiniment bloqueÌe.
La file L1 étant prioritaire, il est possible de créer une file L discontinue si à chaque itération, une voiture est ajoutée sur la premiÚre case de L1.
Cette file discontinue de L1 empeche les voitures de L2 de passer le croisement.
Q15 â EÌtant donneÌes les configurations illustreÌes par la Figure 4, combien dâeÌtapes sont neÌcessaires (on demande le nombre minimum) pour passer de la configuration 4(a) aÌ la configuration 4(b) ? Justifier votre reÌponse.
Il faut 4 étapes pour que les pour que la derniÚre voiture de L1 arrive sur le croisement (si aucune voiture est ajoutée).
Il faut une étape supplémentaire pour libérer le croisement. Lors de cette étape, les voitures de L2 peuvent avancer d'une case.
Il faut ensuite 4 étapes supplémentaires pour que les voitures de L2 avancent dans la configuration 4(b).
Durant les 4 derniÚres étapes, il est possible d'ajouter une voiture à la file L1 pour arriver dans la configuration 4(b).
Il faut donc au minumum 10 Ă©tapes pour passer de la configuration 4(a) aÌ la configuration 4(b).
Q16 â Peut-on passer de la configuration 4(a) aÌ la configuration 4(c) ? Justifier votre reÌponse.
Si la configuration 4(c) était possible, à l'étape précédente une voiture de L1 occuperait le croisement. Cette derniÚre voiture empeche la présence d'une voiture de L2 sur le croisement, il est donc impossible qu'une voiture de L2 soit sur la case qui suit le croisement.
La configuration 4(c) est donc impossible.
Q17 â EÌcrire en langage Python une fonction elim_double(L) non reÌcursive, de complexiteÌ lineÌaire en la taille de Ì L, qui eÌlimine les eÌleÌments apparaissant plusieurs fois dans une liste trieÌe Ì L et renvoie la liste trieÌe obtenue. Par exemple elim_double([1, 1, 3, 3, 3, 7]) doit renvoyer la liste Ì [1, 3, 7]`.
| Python | |
|---|---|
def doublons(liste): if len(liste)>1: if liste[0] != liste[1]: return [liste[0]] + doublons(liste[1:]) del liste[1] return doublons(liste) else: return liste
Q18 â Que retourne lâappel suivant ? doublons([1, 1, 2, 2, 3, 3, 3, 5])
doublons est une fonction rĂ©cursive qui donne le mĂȘme rĂ©sultat que elim_double. l'appel retourne [1, 2, 3, 5]
Q19 â Cette fonction est-elle utilisable pour eÌliminer les eÌleÌments apparaissant plusieurs fois dans une liste non trieÌe ? Justifier.
Cette fonction ne compare que deux cases consĂ©cutives elle est donc inutilisable pour une liste non triĂ©e oĂč deux Ă©lĂ©ments identiques peuvent ne pas ĂȘtre contigus.
Q20 â La fonction recherche donnĂ©e en annexe permet dâĂ©tablir si la configuration correspondant Ă but est atteignable en partant de lâĂ©tat init. PrĂ©ciser le type de retour de la fonction recherche, le type des variables but et espace, ainsi que le type de retour de la fonction successeurs.
La fonction recherche retourne un booléen.
but correspond à la modélisation d'une configuration, c'est une liste de deux listes de booléens.
espace est une liste de configurations, c'est une liste de listes de deux listes de booléens : [[[bool],[bool]]]
successeurs retourne une liste de configurations (une liste de listes de deux listes de booléens) c'est cohérent avec l'utilisation du + à la ligne 6 de recherche.
Q21 - Afin dâamĂ©liorer lâefficacitĂ© du test if but in espace, ligne 10 de lâannexe, on propose de le remplacer par if in1Ì(but, espace) ou bien par if in2(but, espace), avec in1 et Ì in2` deux fonctions dĂ©finies ci-dessous. On considĂšre que le paramĂštre liste est une liste triĂ©e par ordre croissant.
Quel est le meilleur choix ? Justifier.
in1 effectue une recherche itérative qui est linéaire dans le pire des cas.
in2 effectue une recherche dichotomique qui est en \(\mathcal{O}(log(n))\).
in2 est donc plus efficace.
Q22 â Afin de comparer plus efficacement les files reprĂ©sentĂ©es par des listes de boolĂ©ens on remarque que ces listes reprĂ©sentent un codage binaire oĂč Ì Truecorrespond Ă 1 etFalseĂ 0. Ăcrire la fonction Ì versEntier(L)Ì prenant une liste de boolĂ©ens en paramĂštre et renvoyant lâentier correspondant. Par exemple, lâappelversEntier([True, False, False])renverra4`.
| Python | |
|---|---|
Q23 â On veut Ă©crire la fonction inverse de versEntier, transformant un entier en une liste de boolĂ©ens. Que doit ĂȘtre au minimum la valeur de taille pour que le codage obtenu soit satisfaisant ? On suppose que la valeur de taille est suffisante. Quelle condition boolĂ©enne faut-il Ă©crire en ligne 4 du code ci-dessous ?
Une liste de boolĂ©ens de taille taille code au maximum le nombre entier \(2^{taille} -1\). Donc taille doit ĂȘtre supĂ©rieur Ă \(log_2(entier + 1)\).
la boucle while sert Ă affecter les valeurs de la liste, c'est donc
while i >= 0.
Q24 â Montrer quâun appel Ă la fonction recherche de lâannexe se termine toujours.
D'aprĂšs la question Q4, le nombre de configuration d'une liste de taille \(n\) est \(2^n\).
Pour deux listes, \(2 * 2^n\) est donc un majorant d'une nombre de configurations (en effet, la case de l'intersection ne permet pas les cas oĂč elle est occupĂ©e simultanĂ©ment par une voiture de Ì L1Ì et une voiture de `L2Ì ).
Le nombre de configuration est donc fini.
recherche s'arrĂȘte quand il n'y a plus de configuration Ă dĂ©couvrable. Cela sera au plus tard le cas quand on les a toutes dĂ©couvertes.
Si la fonction recherche ne retourne pas de successeurs, recherche s'arrĂȘte.
Si la fonction recherche retourne au moins un successeur, le nombre de configuration diminue stritement et finira donc par valoir 0 si successeur en retourne à chaque itération.
recherche se termine donc toujours.
Q25 â ComplĂ©ter la fonction recherche pour quâelle indique le nombre minimum dâĂ©tapes Ă faire pour passer de init Ă but lorsque cela est possible. Justifier la rĂ©ponse.
Q26 â Ăcrire la requĂȘte SQL qui renvoie les identifiants des croisements atteignables en utilisant une seule voie aÌ partir du croisement ayant lâidentifiant c.
Q27 â EÌcrire la requeÌte SQL qui renvoie les longitudes et latitudes des croisements atteignables en utilisant une seule voie, aÌ partir du croisement c.| SQL | |
|---|---|
Q28 â Que renvoie la requeÌte SQL suivante ?
Elle renvoie tous les ĂŹd des croisements situĂ©s Ă distance 2 (en nombre d'arĂȘtes) du croisement c, dans un graphe orientĂ© du rĂ©seau routier.