L’objectif de cette séance est de découvrir comment colorier chaque sommet d’un graphe à l’aide d’un algorithme glouton.
Colorier un graphe signifie associer une couleur à chacun de ses sommets de façon à ce que deux sommets liés par une arête n’aient pas la même couleur (deux sommets non adjacents peuvent avoir la même couleur).
Colorier un graphe avec un nombre minimal de couleurs est un problème difficile mais l’utilisation d’un algorithme glouton permet de résoudre le problème, au prix d’un nombre de couleurs qui n’est pas toujours minimal.
[Lire]Représentation d'un graphe en informatique
Plusieurs modes de représentation peuvent être implémentés pour stocker des graphes : matrices d’adjacence (ou sommet-sommet), listes des voisins, des successeurs ou des prédécesseurs. Lors de cette séance nous allons écrire les classes réalisant ces implémentations.
Structure de graphe basée sur une liste d’adjacence
-
Écrire le code de la méthode
__init__
de la classeSommet
dont la spécification est :1 2 3 4
def __init__(self: Sommet, val: str) -> None: """ Initialisation d'un sommet. """
Remarque : La classe
[Lire]Sommet
possède deux attributs :
Tri par insertion
Tri du joueur de cartes
Le tri par insertion est un tri « naturel » souvent qualifié de « tri du
joueur de carte ».
Comment un joueur de carte trie-t-il ses cartes ?
- Au début, la main gauche du joueur est vide et ses cartes sont posées sur la table.
- Le joueur prend alors sur la table les cartes, une par une avec sa main droite, pour les placer dans sa main gauche.
- Pour savoir où placer une carte dans son jeu, le joueur la compare avec chacune des cartes déjà présentes dans sa main gauche, en examinant les cartes de la droite vers la gauche.
- À tout moment, les cartes tenues par la main gauche sont triées ; ces cartes étaient, à l’origine, les cartes situées au sommet de la pile sur la table.
- Choisir sept cartes à jouer. Les placer en ligne au hasard sur une table et
mettre en œuvre la technique décrite ci-dessus.
Se filmer pendant toute l’opération en commentant chacune des étapes !
Tri par insertion
Introduction
La méthode du tri par insertion est ilustré à cette adresse, ou, de façon plus folklorique, à cette adresse.
[Lire]Tri par sélection
La recherche d’un élément dans un tableau est beaucoup plus efficace si ce tableau est ordonné. À vrai dire, ce n’est pas en cours d’informatique que vous avez découvert ceci : dans toutes les bibliothèques les livres sont classés de façon à rendre leur recherche plus rapide !
La question que se propose d’aborder ce document est donc : « comment classer les éléments d’un tableau selon une relation d’ordre donnée ? ».
[Lire]Algorithmes de tri
Au programme de la classe de première
Contenus | Capacités attendues | Commentaires |
---|---|---|
Tris par insertion, par sélection | - Écrire un algorithme de tri. - Décrire un invariant de boucle qui prouve la correction des tris par insertion, par sélection. |
- La terminaison de ces algorithmes est à justifier. - On montre que leur coût est quadratique dans le pire cas. |
Documents
-
Doc. Tri par sélection
-
Doc. Tri par insertion
Réalisation d'une classe Liste Chainee
Par transformation des fonctions du document 1 dans ce chapitre en méthodes, écrire le code de la classe Liste
qui définit le type abstrait « Liste chaînée ».
Réponse
|
|
Implémentation du type abstrait Liste Chaînée à l'aide de listes Python
Reprendre toutes les fonctions des sections 2 et 3 du document 1 de ce chapitre, en implémentant cette fois le type abstrait « Liste chaînée » à l’aide de tuples (à la place de la classe).
Réponse
|
|
Somme des $n$ nombres d'un tableau
L’objectif de ce document est d’écrire et d’implémenter un algorithme s’appuyant sur le raisonnement « Diviser pour régner » qui permet de déterminer la somme des $n$ nombres (entiers) d’un tableau.
- Écrire le code de fonction
somme1
dont la spécification est :
|
|
Penser à écrire un jeu de tests.
[Lire]Diviser pour régner
Dans quel cas ?
- On parvient à découper un problème en sous-problèmes indépendants les uns des autres. On poursuit cette démarche jusqu’à aboutir à une situation simple : cas de base.
- La solution du cas de base est généralement simple à obtenir et permet la construction de la solution du problème.
Remarque
C’est l’indépendance des sous-problèmes qui permet la construction de la solution globale directe par recombinaison des solutions intermédiaires.
[Lire]Décomposition d'un problème en sous-problèmes
Principe
- On décompose le problème en sous-problèmes plus simples.
- On résout les sous-problèmes.
- On combine les sous-problèmes de façon à construire la solution du problème initial.
Indépendance des sous-problèmes
- Si les sous-problèmes sont indépendants les uns des autres : « Diviser pour règner ».
- Si les sous-problèmes dépendent les uns des autres : « Programmation dynamique ».