TD7 - Algorithmes de Tri - Algorithmes et Programmation - N. BUYLE-BODIN - Univ Lyon

 
CONTINUER À LIRE
TD7 - Algorithmes de Tri - Algorithmes et Programmation - N. BUYLE-BODIN - Univ Lyon
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