Algorithmie et
Structures de données

 

KESAKO ?

Guillaume FAURE-DUMONT

@guillaume_fd

Té ki dabor ?

Guillaume FAURE-DUMONT

Ingénieur EPITA (2005)

  • Développeur
  • Avant-vente Technique
  • Architecte Logiciel (princ. en finance)
  • Entrepreneur
  • Développeur/CTO Freelance


MeetUp Ruby Parisiens:
       ParisRB, WomenOnRails, MentorsOnRails, Paris Ruby Workshop

Spoilers

  • C'est seulement un "crash course"
    • L'algorithmie, c'est long ;)
    • ... mais vous pourrez briller aux dîners
    • ... ou passer pour un.e gros.se GEEK !
       
  • Le vrai cours, il est dans THP Next !
     
  • Je sais que Ruby, ES6, etc.. ont la méthode "X" qui fait ça !!!
    • Savoir les coder fait toute la différence !
    • Pouvoir choisir sa méthode peut tout changer !!
    • Est-ce qu'au moins tu sais quel algo est utilisé ?
      (au lieu de la ramener !)

Exemple de Besoin Client

  • Trouver le MIN et le MAX d'une liste d'ENTIERS
  • Ca doit aller vite !
  • Pas de limite de mémoire

Précisions

On ne va parler que de théorie :

  • On se fout du langage
  • On veut quelque chose qui fonctionne tout le temps
    • cas normaux ou exceptionnels
  • Mais soit le plus rapide possible

 

On n'a pas plus de détails MAIS certains autres points pourraient changer toute la réflexion

Ca veut dire quoi "aller vite" ?

Nombre d'opérations élémentaires que doit faire le programme pour N valeurs

 

Opération élémentaire :

  • Assignation
  • Comparaison
  • Opération arithmétique

AKA Complexité temporelle

Et la "limite mémoire" ?

L'espace mémoire utilisé par le programme pour obtenir le résultat.

Très difficile à maitriser pour les langages "managés"

AKA Complexité spaciale

Premiers essais

  1.     4; 3; 1; 16; 18; 13; 20; 2; 7; 6

  2.     15; 10; 10; 3; 7; 17; 4; 8; 20; 9; 1

Méthode

  • Stocker les valeurs dans un tableau
  • Parcourir le tableau case par case
    • MAX: si la valeur est supérieure, on la garde
    • MIN: si la valeur est inférieure, on la garde
    • on passe à l'élément suivant
  • Quand on a parcouru tout le tableau, on sait qu'on a la bonne valeur

=> On fait AUTANT d'opérations que la taille du tableau

Amélioration

SANS LES STOCKER spécifiquement

 

Comment faire pour retrouver (autre part dans le programme)

facilement les MIN et MAX ?

Trier le tableau

Algorithmes de tri de tableau :

  • Y'en a 26 listés dans Wikipedia
  • ... mais bcp plus en vrai !
  • On peut les "comparer" selon certains critères :
    • Meilleur cas
    • Cas moyen
    • Pire cas
    • Stabilité
    • Consommation mémoire

Tri à bulles

  • On parcourt le tableau entier
    • Quand un élément est plus grand que le suivant
      • on les inverse
    • On passe à l'élément suivant
  • Quand on fait un parcous sans modification, c'est trié !
  • Très simple à comprendre
  • Très simple à implémenter
  • Stable
  • PAS DU TOUT EFFICACE !     O(n)  - O(N²)

Tri rapide

  • On choisit un élément de la liste (LE PIVOT)
  • On parcourt tous les éléments
    • Si élément > PIVOT  =>  à droite
    • Si élément < PIVOT => à gauche
  • On obtient 2 sous-listes
    • on refait pareil sur chacune
  • Quand les listes sont d'un seul élément, c'est trié !
  • Simple à comprendre
  • A implémenter... ça va ;)
  • Pas stable
  • TRES EFFICACE !  (QUASI tout le temps)    O(n log n)  - O(N²)

Expérimenter et comprendre les différences

Il y a plein de méthodes différentes à expérimenter et comparer selon :

  • Les contraintes métier (comparaison, stabilité ?)
  • Le langage utilisé
  • Les contraintes techniques (mémoire ?)

 

https://www.youtube.com/watch?v=ZZuD6iUe3Pc

OK mais si on rajoute qqchose ?

Ba ... c'est la merde !

 

  • Il faut re-trier le tableau
     
  • Beaucoup d'algorithmes de tri n'aiment pas les tableaux "presque triés" !

Les ARBRES à la rescousse !

  • Structure de données assez courante
     
  • ... et TRES pratique !
     
  • On  ne va parler que d'arbres binaires aujourd'hui

Arbre Binaire de Recherche

  • Chaque nœud a une clef
     
  • Chaque clef à gauche est  =<   à la clef de son parent
     
  • Chaque clef à droite est  =>   à la clef de son parent

DEMO !

Intérêt des ABR

  • L'ajout trie directement
     
  • Recherche de MIN / MAX
    • Plus long que sur un tableau trié
    • Beaucoup plus court que sur un tableau non-trié
       
  • Recherche d'un élément
    • Beaucoup plus court que sur un tableau (trié ou non !)

Inconvenients des ABR

Il faut apprendre à manipuler les arbres !

  • Comment on supprime un nœud ??!?
     
  • Parcourir les nœuds par ordre croissant
    (parcours infixe)
     
  • Autres parcours
     
  • Equilibrage d'arbre :D

Besoin métier => Structure

Caractériser les structures de données

  • Complexité
    • Accès
    • Recherche
    • Ajout
    • Suppression

 

Choisir la structure en fonction de ses besoins métiers

Autres structures de données...

  • Matrices
    • Qui a parlé de carte de jeu vidéo ???
       
  • Matrices à n-dimensions
    • Quels jeux 3D ??
       
  • Graph
     
  • Et les votres !

...et méthodes de manipulation !

  • Matrices
     
  • Graph

Questions !

Guillaume FAURE-DUMONT

@guillaume_fd

Algorithmie et structures de données

By Guillaume Faure-Dumont

Algorithmie et structures de données

  • 314