| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
Il nous est demandé de créer un algorithme qui détermine le nombre minimum de salles de cours nécessaire au déroulement d'une journée d'école. La difficulté réside dans le fait que les cours peuvent se chevaucher, mais deux cours ne peuvent partager une salle.
Les données sont fournies sous forme d'un fichier JSON contenant une liste de sessions. Chaque session est définie par une heure de début (format HH:MM), une heure de fin (format HH:MM), le nom du cours et le nom de l'intervenant. Un cours se terminant à 14:00 peut être suivi d'un autre commençant à 14:00 dans la même salle.
J'ai commencé par me représenter sur une feuille de papier plusieurs cas de figure à 2, 3 et 4 salles.
Cela m'a permis de mettre à jour que seuls les points "start" et "end" de chaque cours m'étaient utiles. En les triant du plus tôt au plus tard et en les associant à un compteur, je peux déterminer à quel moment une salle est libérée, et à quel moment une salle est occupée.
La logique de mon algorithme est donc la suivante :
Entrée JSON
[
{
"start": "09:00",
"end": "10:00",
"session_name": "Cours A",
"teacher_name": "Prof A"
},
{
"start": "09:30",
"end": "10:30",
"session_name": "Cours B",
"teacher_name": "Prof B"
},
{
"start": "10:00",
"end": "11:00",
"session_name": "Cours C",
"teacher_name": "Prof C"
},
{
"start": "09:30",
"end": "11:00",
"session_name": "Cours D",
"teacher_name": "Prof D"
}
]Liste d'événements triée :
[("09:00", +1), ("09:30", +1), ("09:30", +1), ("10:00", +1), ("10:00", -1), ("10:30", -1), ("11:00", -1), ("11:00", -1)]
Calcul :
Résultat final : 4 salles minimum sont nécessaires
def load_sessions(file_path):
with open(file_path, "r", encoding="utf-8") as file:
return json.load(file)Cette fonction lit un fichier JSON, et le charge avec json.load(file). Cette fonction a donc une complexité O(n), où n est le nombre de sessions dans le fichier.
Complexité totale : O(n)
def create_events(sessions):
events = []
for session in sessions:
events.append((session["start"], +1))
events.append((session["end"], -1))
return eventsCette fonction prend en entrée les sessions, qui sont au nombre de n. Pour chaque session, elle ajoute deux événements dans la liste events, la complexité de cette tâche est fixe, donc O(1).
Complexité totale : O(n)
def calculate_rooms(events):
events.sort(key=lambda x: (x[0], x[1]))
number_rooms = 0
max_rooms = 0
for _, change in events:
number_rooms += change
max_rooms = max(max_rooms, number_rooms)
return max_rooms.sort() utilise Timsort, qui a une complexité de O(n log n) dans le pire des cas (source : https://fr.wikipedia.org/wiki/Timsort). On parcourt ensuite tous les éléments de events une seule fois. À chaque itération, on effectue des tâches de complexité O(1), puisque fixes.
Complexité totale : O(n log n)
def main():
if len(sys.argv) < 2:
print("Erreur : veuillez fournir le chemin du fichier JSON en argument.")
sys.exit(1)
test_file = sys.argv[1]
sessions = load_sessions(test_file)
events = create_events(sessions)
max_rooms = calculate_rooms(events)
print(max_rooms)La fonction main appelle les trois autres fonctions. La complexité globale est déterminée par l'opération la plus coûteuse, soit O(n log n).
Complexité finale : O(n log n)
Sources :
| Back | FazBrowse Home | New Git URL |