Exercice 3 - Partie D : Arbres binaires de recher… · Bac Numérique et Sciences Informatiques Métropole 2025 (sujet 1)
Thème : Arbres : vocabulaire, mesures et algorithmique · Tiré du sujet Métropole France 1 (2025)
Énoncé
Cet exercice porte sur l'architecture matérielle (réseau), les arbres binaires de recherche et la programmation Python.
L'entreprise CaféNet possède plusieurs cafés répartis dans différentes villes. Le réseau de la chaîne de cafés est représenté en Figure 1.
Sur le schéma sont représentés 4 routeurs, le réseau du siège social, le réseau du café 1, le réseau du café 2. Dans les réseaux du café 1 et du café 2, des bornes de commandes sont connectées à des switchs (ce sont des boitiers de connexion qui n'ont pas eux-mêmes d'adresse IP). Les 4 routeurs représentés sont composés d'au moins 3 interfaces réseau capable de relier des réseaux ensemble. Chaque interface possède donc une adresse IPV4 sur le réseau auquel elle est reliée.
Les masques des sous-réseaux sont tous 255.255.255.0. Avec ce masque, les trois premiers octets des adresses IP codent l'adresse réseau. Le dernier octet, c'est-à-dire les 8 derniers bits, code l'adresse des machines à l'intérieur de chaque sous-réseau.
Partie D: Arbres binaires de recherche
Le but de cette partie est de classer les adresses IP des différents réseaux afin de faciliter leur recherche.
La fonction ip_bin prend en argument une chaîne de caractères décrivant une adresse IP en notation décimale, et renvoie une chaîne de caractères, de longueur 35 (32 bits et les 3 points), décrivant l'adresse IP en notation binaire.
>>> ip_bin('192.168.10.1')
'11000000.10101000.00001010.00000001'
10.
Donner la chaîne de caractères renvoyée par ip_bin('192.168.20.12').
La fonction precede prend en paramètres deux adresses IP en notation binaire, sous forme de chaînes de caractères identiques à celles renvoyées par la fonction ip_bin. La fonction precede renvoie un booléen qui vaut True si la première adresse IP en paramètre précède la seconde adresse IP.
>>> a = '11000000.10101000.00001010.00000001'
>>> b = '11000000.10101000.00001111.00000001'
>>> precede(a, b)
True
L'algorithme compare bit à bit les deux chaînes binaires, en lisant les chaînes de caractères dans le sens usuel (de gauche à droite). Dans l'exemple ci-dessus, tous les caractères sont identiques jusqu'au sixième caractère du troisième octet. Comme le bit de l'adresse a est inférieur à celui de l'adresse b, on en déduit que l'adresse IP a précède l'adresse IP b.
Si la première adresse IP ne précède pas la seconde, la fonction doit renvoyer False.
L'algorithme de comparaison est traduit dans le langage Python sous la forme suivante:
1 def precede(ip_1, ip_2):
2 for i in range(35):
3 if ip_1[i] < ip_2[i]:
4 return...
5 elif ip_1[i] > ip_2[i]:
6 return...
7 return...
11.
Expliquer dans quel cas la fonction precede exécutera la dernière instruction return de la ligne 7.
12.
Recopier et compléter les lignes 4, 6 et 7 du code de la fonction precede.
Ligne 4: return
Ligne 6: return
Ligne 7: return
Les tables de routage de chaque routeur sont implémentées sous la forme d'arbre binaire de recherche avec la classe Abr.
1 class Abr:
2 def __init__(self, adresse_ip,
3 interface, passerelle,
4 cout):
5 self.adresse_ip = adresse_ip
6 self.interface = interface
7 self.passerelle = passerelle
8 self.cout = cout
9 if adresse_ip != '':
10 self.gauche = Abr('', '', '', 0)
11 self.droite = Abr('', '', '', 0)
12
13 def est_vide(self):
14 return...
Dans cette représentation:
adresse_ip désigne l'adresse IP de la destination;
interface désigne l'interface réseau;
passerelle désigne l'adresse IP du prochain routeur;
cout désigne le nombre de sauts pour atteindre la destination;
par convention, l'arbre binaire vide est une instance de Abr pour laquelle adresse_ip est une chaîne de caractères vide;
un arbre binaire de recherche non vide possède nécessairement un sous-arbre gauche et un sous-arbre droit, éventuellement vides, qui sont tous les deux des arbres binaires de recherche. Ces sous-arbres sont désignés par gauche et droite dans la classe Abr;
si elle n'est pas vide, l'adresse IP du sous-arbre gauche précède l'adresse IP de l'instance parent;
si le sous-arbre droit n'est pas vide, alors l'adresse IP de l'instance parent précède l'adresse IP du sous-arbre droit.
13.
Citer un attribut et citer une méthode de la classe Abr.
14.
Recopier et compléter la ligne 14 du code de la classe Abr.
Ligne 14: return
15.
Justifier, en mobilisant des connaissances de cours, l'intérêt qu'il peut y avoir à représenter la table de routage par un arbre binaire de recherche.
La section de code qui définit modifie est incluse dans la classe Abr.
16 def modifie(self, adresse_ip,
17 interface, passerelle,
18 cout):
19 if self.est_vide():
20 self.adresse_ip = adresse_ip
21 self.interface = interface
22 self.passerelle = passerelle
23 self.cout = cout
24 self.gauche = Abr('', '', '', 0)
25 self.droite = Abr('', '', '', 0)
26 else:
27 self.adresse_ip = adresse_ip
28 self.interface = interface
29 self.passerelle = passerelle
30 self.cout = cout
Les lignes 20 à 23 sont exactement les mêmes que les lignes 27 à 30.
16.
Réécrire le code de la fonction modifie en évitant cette répétition.
La classe Abr est complétée afin de permettre l'ajout de nouvelles lignes à la table de routage, tout en conservant les propriétés que doit posséder un arbre binaire de recherche.
32 def rechercher(self, adresse_ip):
33 if self.est_vide() or adresse_ip==self.adresse_ip:
34 return self
35 elif precede(...):
36 return self.gauche.rechercher(adresse_ip)
37 else:
38 return self.droite.rechercher(adresse_ip)
39
40 def inserer(self, adresse_ip,
41 interface, passerelle,
42 cout):
43 destination = self.rechercher(adresse_ip)
44 destination.modifie(adresse_ip,
45 interface, passerelle,
46 cout)
On rappelle que la fonction precede prend en arguments des adresses IP écrites sous forme binaire.
17.
Recopier et compléter la ligne 35 du code de la fonction rechercher.
Ligne 35: elif precede(
):

Corrigé
Corrigé proposé par AprenAI (non officiel)
10. Donner la chaîne de caractères renvoyée par ip_bin('192.168.20.12').
Réponse : '11000000.10101000.00010100.00001100'
11. Expliquer dans quel cas la fonction precede exécutera la dernière instruction return de la ligne 7.
Réponse : Lorsque les deux adresses IP sont strictement identiques (aucun caractère ne diffère sur les 35 indices).
12. Ligne 4 du code de la fonction precede.
Réponse : True
12. Ligne 6 du code de la fonction precede.
Réponse : False
12. Ligne 7 du code de la fonction precede.
Réponse : False
13. Citer un attribut de la classe Abr.
Réponse : adresse_ip / interface / passerelle / cout / gauche / droite
Les réponses des 5 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.
‹ Exercice 3 - Partie A · Métropole 2026 (sujet 1) · Exercice 1 · Métropole 2025 (sujet 2) ›
Plus d’exercices d’Arbres : vocabulaire, mesures et algorithmique
- Exercice 3 - Partie A · Métropole 2026 (sujet 1)
- Exercice 1 · Métropole 2025 (sujet 2)
- Exercice 3 - Arbres binaires de recherche · Métropole 2024 (sujet 1)
- Exercice 3 - Partie 1 · Métropole 2023 (sujet 2)
- Exercice 4 · Métropole 2022 (sujet 1)
- Exercice 1 · Métropole 1 remplacement 2022
- Exercice 1 · Métropole 2022 (sujet 2)
- Exercice 2 · Métropole 2 remplacement 2022
- Exercice 3 · Métropole Candidat libre 2021 (sujet 2)
- Exercice 1 · Métropole 2021 (sujet 1)