Algorithmes de tri

Référence au programme de NSI

On veut trier une liste lorsqu’on pense que ses éléments sont dans le désordre, ou plus précisément dans un ordre qui ne nous convient pas. L’objectif du tri, en tant qu’algorithme, est de mettre les éléments dans le bon ordre. Par exemple sur STRAVA qui est un site et une application mobile pour enregistrer les activités sportives, l’utilisateur peut classer ses activités par années, semaines, distances parcourues, temps sur certains parcours mythiques (segment) .

Sur ce tableau le classement est réalisé sur le temps d’ascension, par ordre croissant.

Nous allons étudier 2 algorithmes de tri :

(cliquez pour ouvrir les articles)

le tri par sélection et le tri par insertion.

Nous avons calculer le nombre comparaison que faisait les algorithmes dans le tri par insertion et sélection, On parle de complexité . La complexité d’un tri de « n » éléments se note avec un « omicron » : dites « grand O ». Par exemple, la complexité du « tri par sélection » sera en « O(n*(n-1) /2 ) », où « n*(n-1) /2 » est la formule qu’on avait utilisée un peu plus tôt. Comme on s’intéresse à des valeurs importantes et qu’on ne veut qu’un « ordre de grandeur », on considérera que cette « complexité » peut se « simplifier » en « O(n*(n-1)) », qui peut elle-même se simplifier en « O(n²) ». On dira que l’algorithme du « tri par sélection » est de « complexité quadratique » en « O(n²) ».

Pour notre classement il y a 80 000 valeurs à trier voici un tableau résumant le nombre d’opération et une estimation du temps en supposant qu’une opération dure 1 ms.

Nombre d’éléments « n »Nombre d’opérations pour un tri en « O(n²) »Durée pour un tri en « O(n²) »
10100100 ns
10010 00010 us
1 0001 000 0001 ms
10 000100 000 000100 ms
100 00010 000 000 00010 s
1 000 0001 000 000 000 00016 min 40 s
10 000 000100 000 000 000 00027 heures
100 000 00010 000 000 000 000 000115 jours
1 000 000 0001 000 000 000 000 000 00031 ans

Il y a 1.2 millions d’utilisateur de Strava , 3.4 milliard d’utilisateur de Facebook . Les données à trier ne manquent pas….Et le temps de les trier elles seront peut être obsolètes.

Comment faire ? Il existe des algorithmes de tri plus performant: Tri à bulles , Tri rapide , ….

A faire:

Essai évaluation par le temps d’exécution du programme de tri:

Estimation de complexité par le temps d’exécution (approximation car le temps d’exécution d’un algorithme est aussi lié à d’autres paramètres… )

En ouvrant et exécutant le programme de tri :

tris-avec_evaluation-temps-execution_programme.py

à télécharger en fin d’article.

 extrait du programme

# tri rapide avec affichage du temps passé
 debut_chrono=time.time() # lancement chrono
 trirapide(L) # lancement du tri
 temps_exe=time.time()-debut_chrono #arret chrono et calcul du temps 
 print("nombre de valeur =",len(L)) # affichage nb valeurs
 print("temps execution tri rapide =",temps_exe) # affichage crhono

Essayer de lancer ce programme en testant une liste aléatoire de 10, 100 , 1000, 10000 valeurs, faire un classement des tris.

Maintenant au lieu de trier une liste aléatoire, trions une liste déjà triée. Refaites votre classement .

Quelles conclusions tirez vous de vouloir classer la complexité d’un algorithme par son temps d’exécution?

(Rappel les deux algorithme fusion et insertion ont la même complexité)

Mini projet:

Amélioration , Il vaudrait mieux compter le nombre d’opération de comparaison dans l’algorithme de tri. Proposer une solution de compteur dans le programme de tri de votre choix

vous trouverez ici tous les fichiers à télécharger.

Projet : Compteur de point à la coinche

Fonctionnalités attendues

  1. Créer la partie, joueurs, équipe.
  2. Enregistrer les mises et annonces de départ.
  3. Créer interface résultats de la donne.
  4. Faire des statistiques, donneur, etc .
  5. Calculer les points de la donne.
  6. Faire les totaux pour chaque équipe.
  7. Développer interface Android.
  8. Arrêter la partie sur valeur maximum (à définir) ou sur demande.
  9. Préciser l’atout de la donne.
  10. Créer un rappel des règles et annonces du jeu.

Exemple de comptage en ligne

https://www.compteur-carte.net/belote/index.htm

Projet : Escape game

Fonctionnalités attendues

  1. Le but du jeu est de résoudre un certain nombre d’énigmes pour sortir d’un lieu en temps limité. Pour simplifier, le lieu est seulement composé de deux pièces.
  2. Le programme sera réaliser en Python avec l’interface graphique tkinter.
  3. Le jeu se joue à la souris. Le joueur indique l’action qu’il souhaite exécuter et le programme lui donne le résultat.
  4. L’écran du jeu est partagé en plusieurs parties :
    • la vue sur la pièce en cours (vu de dessus)
    • une liste de verbe d’action (regarder, ouvrir, utiliser, ramasser, associer etc.)
    • l’inventaire des objets détenus par le joueur
    • une zone de résultat de l’action en cours
    • l’affichage du temps restant.
  5. Chaque action est l’association d’un verbe d’action et soit d’un objet de l’inventaire, soit d’un objet de la pièce. Le résultat de l’action apparaîtra dans la zone de résultat (par exemple : « La porte s’ouvre »). Une réponse sera donné à chaque action du joueur, quelque soit la combinaison verbe + objet (prévoir une réponse générique, du type « il ne se passe rien »).
  6. L’inventaire doit pouvoir évoluer, en gagnant ou en perdant des objets. Il est possible d’associer des objets (par exemple « Associer les pile et la lampe sans piles »).
  7. La solution au jeu sera composé de deux quêtes distincts qui devront être réalisée toutes les deux avant de sortir (par exemple trouver un document secret et le code d’ouverture de la porte). La réalisation de ces deux quêtes peut être réalisée dans n’importe quel ordre. Chacune comportera un certain nombre d’étapes à réaliser dans un certain ordre.
  8. À la fin du temps le joueur a perdu. S’il termine avant la fin il gagne.
  9. Les meilleurs temps sont enregistrés et peuvent être affichés, même après avoir fermé puis rouvert le programme.

Projet : Cryptage/décryptage

Fonctionnalités attendues

  1. Le programme permettra de réaliser le codage et le décodage de messages.
  2. Le programme sera réalisé en python avec la bibliothèque tkinter pour interface.
  3. La fenêtre sera composée de deux zones, avec le message crypté et le message décrypté.
  4. Les algorithmes suivants seront pris en charge :
    • cryptage César
    • cryptage Vernam
  5. Le programme sera capable de deviner le type de codage utilisé, parmi ceux disponibles.
  6. Un générateur de mot de passe sera également proposé. Celui-ci créera des mots de passes composés d’un nom, d’un adjectif et d’un verbe, avec minuscule/majuscule et modifications (par exemple s→5, o→0 etc.)
  7. Un bouton permettra d’envoyer le message codé par mail (voir : http://apprendre-python.com/page-python-envoyer-mail-smtp).

Projet : Visualisation de données

Fonctionnalités attendues

  1. Le programme permet d’afficher un même jeu de donnée de différentes manières et ainsi de comparer différentes représentation du même jeu de données.
  2. Le programme sera réalisé en Python, avec les bibliothèques matplotlib (pour le tracé) et tkinter (pour l’interface).
  3. Le programme pourra lire un jeu de donnée (format à déterminer, par exemple csv). Ces données contiendront, pour différentes années, le PIB et le nombre d’habitants de différents pays.
  4. Il sera possible :
    • d’étudier soit le PIB, soit la population, soit le PIB/habitant
    • de sélectionner les pays que l’on veut afficher à l’aide de cases à cocher
    • d’afficher l’évolution dans le temps de ces grandeurs soit sous forme de courbes, soit sous forme d’histogramme
    • de comparer différents pays à une date donnée soit sous forme de diagramme circulaire, soit sous forme d’histogramme
    • de sélectionner la plage de temps tracée
    • de changer les valeurs min et max utilisée en ordonnée
  5. Un bouton permettra de sauvegarder le graphique en cours sous forme d’image.
  6. Si possible : un clic à la souris sur un point permettra de l’afficher (voir https://matplotlib.org/users/event_handling.html).