TD7 - Algorithmes de Tri - Algorithmes et Programmation - N. BUYLE-BODIN - Univ Lyon
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Algorithmes et Programmation TD7 – Algorithmes de Tri N. BUYLE-BODIN N. PRONOST 1 M1 – MEEF NSI 2022-23
Mise en train 1. Programmer en Python une fonction tri_selec_max() dont le paramètre est un tableau d’entiers tab et qui trie par ordre croissant les éléments de tab, en effectuant une sélection du maximum (fonction à effet de bord). Par exemple, avec le tableau tab = [5, 7, 2, 8, 1, 2, 5, 4], on a les étapes suivantes : 2 4 1 0 5 9 6 3 7 8 2 4 1 0 5 8 6 3 7 9 2 4 1 0 5 7 6 3 8 9 2 4 1 0 5 3 6 7 8 9 2 4 1 0 5 3 6 7 8 9 2 4 1 0 3 5 6 7 8 9 2 3 1 0 4 5 6 7 8 9 2 0 1 3 4 5 6 7 8 9 1 0 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 2 M1 – MEEF NSI 2022-23
Mise en train – Correction du 1. def tri_selec_max(tab): """ tab – list, tableau d'entiers Sortie: None – Les éléments de tab sont triés par ordre croissant (fonction à effet de bord) """ for i in range(len(tab)-1, 0, -1): indice_maxi = i for k in range(i): if tab[indice_maxi]
Mise en train 2. Prouver la terminaison de cet algorithme def tri_selec_max(tab): for i in range(len(tab)-1, 0, -1): indice_maxi = i for k in range(i): if tab[indice_maxi]
Mise en train 3. Prouver la correction de cet algorithme en exhibant un invariant de boucle. def tri_selec_max(tab): for i in range(len(tab)-1, 0, -1): indice_maxi = i for k in range(i): if tab[indice_maxi]
Mise en train 4. Justifier que la complexité de cet algorithme est quadratique. def tri_selec_max(tab): for i in range(len(tab)-1, 0, -1): indice_maxi = i for k in range(i): if tab[indice_maxi]
Mise en train 7 M1 – MEEF NSI 2022-23
TRIER 8 M1 – MEEF NSI 2022-23
Trier Voici la définition que l’on peut trouver dans le Larousse : Trier - verbe transitif : Classer, répartir les différents éléments d'un ensemble en groupes selon quelque critère (par ex. trier le courrier). « Trier » est donc un synonyme de « classer » Classer - verbe transitif : Ranger, ordonner des choses, des personnes d'une certaine manière ; les mettre en ordre (par ex. Classer les mots par ordre alphabétique) Qui lui-même est un synonyme de « ranger » Ranger - verbe transitif : Disposer des choses dans un ordre déterminé (par ex. Ranger des mots dans l'ordre alphabétique) 9 M1 – MEEF NSI 2022-23
Trier Trier, ranger des objets, des livres, des informations sont nécessaires dans toutes les activités humaines. « Trier » consiste à organiser ces objets, à les ordonner selon certaines règles prédéterminées appelées relation d'ordre. Par exemples : ● « l'ordre alphabétique » du dictionnaire ; ● « l'ordre croissant » pour trier des nombres ou des valeurs. Des informations triées sont plus faciles à étudier. Effectuer un tri efficace est donc un des problèmes fondamentaux de l’informatique. 10 M1 – MEEF NSI 2022-23
Algorithmes de tri On appelle algorithme de tri une procédure qui ordonne un ensemble d'objets selon la relation d'ordre considérée. En voici quelques-uns : ● Tri stupide ● Tri rapide ● Tri par sélection ● Tri par tas ● Tri par insertion ● Tri comptage ● Tri à bulles ● Tri par base ● Tri fusion ● Tri par paquets C’est au cours de la seconde guerre mondiale que la création de la première routine de tri a été effectuée sur l’ENIAC par la mathématicienne Betty Holberton. 11 M1 – MEEF NSI 2022-23
DANS LES PROGRAMMES 12 M1 – MEEF NSI 2022-23
Programme de 1ère NSI 13 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Obligations Le programme est clair : ● Les tris par insertion et par sélection doivent être étudiés ● Il faut justifier la terminaison de chacun d’eux (variant de boucle) ● Il faut prouver la correction de chacun d’eux en exhibant un invariant de boucle ● Il faut montrer que leur complexité est quadratique dans le pire des cas 14 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Mise en œuvre Une application simple de ces algorithmes en informatique est d'ordonner une séquence d'entiers choisis au hasard. Conseils : ● Dans les exemples, attention au risque de confusion entre la valeur des éléments à trier et leur indice. ● Varier les exemples d’implémentation (avec ou sans effet de bord). ● Varier les types des éléments à trier (ne pas se contenter des entiers). ● Amener les élèves à reformuler les étapes, à comprendre le sens de ces algorithmes pour qu’ils puissent maîtriser l’implémentation de ces algorithmes. ● Dans l’étude de la complexité, ne pas oublier que certains élèves auront arrêté les mathématiques en classe de 2nde… ● Il est possible de varier en introduisant d’autres tris de même complexité : le tri à bulles ou le tri des crêpes par exemple. 15 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Mise en œuvre Une application simple de ces algorithmes en informatique est d'ordonner une séquence d'entiers choisis au hasard. Conseils : ● Aborder le tri par sélection avant le tri par insertion ● Le tri par sélection permet un retour sur les algorithmes de recherche d’extremum ● Le tri par insertion permet un retour sur les algorithmes de parcours de tableau, en particulier le décalage d’un rang à droite (ou à gauche) ● Attention ! Les « tranches » (slices) de tableau ne sont pas au programme. 16 M1 – MEEF NSI 2022-23
Programme de Tale NSI 17 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Obligations Le programme est (moins) clair : ● Le tri fusion doit être étudié ● Le tri fusion doit être implémenté récursivement avec la méthode « Diviser pour régner » ● Le programme n’évoque par la terminaison de cet algorithme ● Le programme n’évoque par la correction de cet algorithme ● Il faut montrer que sa complexité est en n log(n) dans le pire des cas 18 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Mise en œuvre Un travail débranché préalable permet au élèves d’avoir une (bonne) représentation mentale du principe du tri fusion Conseils : ● Dans les exemples, attention au risque de confusion entre la valeur des éléments à trier et leur indice. ● Dans l’étude de la complexité, avoir recours au Master Theorem est hors programme. Il faut donc pouvoir justifier cette complexité sans faire appel à ce théorème... ● Attention ! Les « tranches » (slices) de tableau ne sont pas au programme. ● Il est possible de varier en introduisant d’autres tris de même complexité : le tri rapide par exemple. ● Il ne faut pas oublier de retravailler les tris par sélection et par insertion qui sont au programme de l’épreuve pratique. 19 M1 – MEEF NSI 2022-23
LE TRI EN PYTHON 20 M1 – MEEF NSI 2022-23
Timsort Le tri préprogrammé en Python est nommé « Timsort ». Il s'agit d'un tri « hybride » faisant intervenir tri fusion et tri par insertion. Vous trouverez des détails sur cette page wikipedia, ou encore dans le fichier merge_strategies.pdf. 21 M1 – MEEF NSI 2022-23
.sort() La méthode .sort() s’applique uniquement à un tableau tab (type list) et modifie ce tableau (par effet de bord) en triant ses éléments par ordre croissant. Par exemple : >>> A = [2, 4, 1, 5, 90, 0, -2] >>> B = A.sort() >>> A [-2, 0, 1, 2, 4, 5, 90] >>> B None 22 M1 – MEEF NSI 2022-23
sorted() La fonction sorted() prend en paramètre un itérable (str, tuple, list, dict, ...) et renvoie un nouveau tableau contenant les éléments de l’itérable triés par ordre croissant. Par exemple : >>> A = [2, 4, 1, 5, 90, 0, -2] >>> A = "azer" >>> B = sorted(A) >>> B = sorted(A) >>> A >>> A [2, 4, 1, 5, 90, 0, -2] "azer" >>> B >>> B [-2, 0, 1, 2, 4, 5, 90] ['a', 'e', 'r', 'z'] 23 M1 – MEEF NSI 2022-23
Trier suivant un critère Parmi les paramètres utiles de la fonction sorted() et de la méthode .sort(), on peut relever : le paramètre key auquel on affecte une fonction critere_de_tri(), ● qui servira de critère de tri (sic !) ; ● Le paramètre reverse auquel on affecte la valeur True pour effectuer un tri par ordre décroissant. Par exemple : >>> def moyenne(controles): return sum(controles)/len(controles) >>> notes = [[8, 12, 9], [2, 18, 15], [14, 13, 17], [10, 11, 12]] >>> B = sorted(notes, key=moyenne, reverse=True) >>> B [[14, 13, 17], [2, 18, 15], [10, 11, 12], [8, 12, 9]] 24 M1 – MEEF NSI 2022-23
En tant qu’enseignant – Vigilance ! Faut-il utiliser les fonctions de tri pré-programmées en Python ? Conseils : ● Formuler clairement, sur sa fiche de préparation de séance, quel est son objectif lorsqu’on donne un travail aux élèves. ● Si l’objectif principal est de programmer un algorithme de tri (ou une application directe de cet algorithme), il n’est pas raisonnable de faire appel aux fonctions pré-programmées. ● Si l’objectif principal est l’étude de données, pour laquelle on a besoin d’appliquer un tri, alors faire appel aux fonctions pré- programmées permettra aux élèves de respecter cet objectif. 25 M1 – MEEF NSI 2022-23
POUR CONCLURE 26 M1 – MEEF NSI 2022-23
Préparer le concours / Enseigner Au concours, sauf contrordre, je peux utiliser : ● Les tranches (slices) ● Le Master Theorem ● Les fonctions et méthodes préprogrammées de tri en Python ( sorted() et .sort()). En tant qu’enseignant : ● Pas de slices, il faut programmer une fonction auxiliaire ● Pas de Master Theorem, il faut justifier la complexité en détaillant la démarche (à des élèves ayant parfois arrêté les maths « tôt ») ● J’utilise sorted() et .sort() avec parcimonie, lorsque la manière d’obtenir des informations triées est secondaire 27 M1 – MEEF NSI 2022-23
Pour la prochaine séance Étudier les commandes usuelles pour manipuler les fichiers en Python et les mettre en œuvre à partir de la fiche M1_NSI_Algo_TD8_Fichiers_Introduction.pdf. 28 M1 – MEEF NSI 2022-23
Vous pouvez aussi lire