Algorithmie — fiche de révision

Structures de données, types abstraits et complexité (Big O).

« Algorithms + Data Structures = Programs » (Niklaus Wirth). L'algorithmie est la partie du génie logiciel qui se concentre sur les étapes logiques pour atteindre le but. Deux regards : le mathématicien cherche un optimal absolu ; l'ingénieur cherche un optimal pratique — efficace, puis efficient.

Définitions à savoir

Structures & types abstraits

Structure de donnéesorganisation de types primitifs par des relations et des opérations (concrète).
Enregistrement (record)simple regroupement de types (ex. le tuple). Si la structure encapsule aussi les opérations → c'est un objet.
Type de données abstrait (TDA)type défini par son comportement (sa sémantique), composé à partir de types primitifs (ou d'autres TDA), offrant une abstraction du matériel. (Inventé par Barbara Liskov, 1974.)
ListeTDA qui restitue ses données dans l'ordre où elles ont été fournies (parcourable dans cet ordre, accès par indice).
CollectionTDA qui rend l'ensemble des données fournies — sans rien garantir (ni ordre, ni unicité).
Ensemble (set)TDA qui rend les données uniques (sans doublons) ; aucun ordre garanti.
Ensemble ordonnéun set qui respecte en plus une relation d'ordre imposée.
Pile (stack)TDA LIFO : dernier-arrivé, premier-sorti.
File (queue)TDA FIFO : premier-arrivé, premier-sorti.
Tableau dynamique (vecteur)structure qui implémente une liste via un tableau (ex. ArrayList).
Liste chaînéestructure qui implémente une liste par une valeur + un pointeur vers le suivant.
DictionnaireTDA qui accède à une valeur à partir d'une clé en O(1) (= table d'association).
Arbre binaireTDA qui associe à toute valeur au plus deux fils directs.
Arbre binaire de recherchearbre binaire ordonné : fils gauche < parent < fils droit.

Complexité

Complexité algorithmiqueestimation du degré de composition d'un algorithme (« complexe » = composé), en ordre de grandeur.
Complexité temporellenombre d'opérations CPU nécessaires.
Complexité spatialequantité de mémoire RAM nécessaire (totale, et auxiliaire).
Notation Big Oordre de grandeur quand N → ∞. Ω = meilleur cas, θ = cas moyen, O = pire cas.
Fonction de hachagef(valeur) → entier, qui maximise l'entropie, est prédictible, peu coûteuse et en O(1).
Entropiegrandeur qui caractérise le degré de désorganisation d'un système.

Les structures de données (types abstraits)

Un TDA est défini par ce qu'il fait (son contrat), pas par comment il est réalisé. On peut donc raisonner sur les lois de l'abstraction sans considérer la machine — c'est l'émergence d'une pensée architecturale. Une même abstraction peut avoir plusieurs implémentations.

StructureRègle / sémantiqueImplémentation typique
Listeordre d'insertion, accès par indicetableau dynamique / liste chaînée
Ensemble (set)données uniques, sans ordretable de hachage
Ensemble ordonnéuniques + relation d'ordrearbre binaire de recherche
Pile (LIFO)dernier entré, premier sorti — ex. CTRL-Z, retour navigateurtableau / liste chaînée
File (FIFO)premier entré, premier sorti — ex. requêtes d'un serveurliste chaînée
Dictionnairevaleur via clé en O(1)table de hachage
Arbre bin. de recherchegauche < parent < droitenœuds + pointeurs / tableau

Dériver les tests d'un TDA (méthode du cours) : le cas nominal (insérer puis récupérer, vérifier l'ordre), les cas limites (structure vide, au-delà du dernier, indice négatif, doublons) et les cas dégénérés (indice invalide). Penser aussi à la mutabilité et à la taille.

La complexité algorithmique (Big O)

On estime le coût quand le nombre d'éléments N devient grand, indépendamment du matériel (c'est une abstraction). Pour un même algorithme, on distingue le meilleur cas Ω, le cas moyen θ (qui dépend des données d'entrée) et le pire cas O.

coût N → O(1) O(log N) O(N) O(N²)
Plus la courbe monte vite, plus l'algorithme coûte cher quand N grandit. O(1) est idéal, O(N²) explose.
ClasseNomExemple
O(1)constanteaccès par indice ; accès à un dictionnaire / set
O(log N)logarithmiquerecherche dichotomique ; arbre binaire de recherche équilibré
O(N)linéaireparcours / recherche dans une liste (une boucle for)
O(N²)quadratiquedeux boucles for imbriquées (recherche de doublons)
O(2ᴺ)exponentielleà éviter (mais négligeable si N reste petit)

Spatiale : mêmes notations. On distingue la complexité totale et la complexité auxiliaire (l'espace supplémentaire utilisé). Ex. : sommer un tableau → spatiale O(N), auxiliaire O(1) ; créer une matrice N×M → O(N×M) pour les deux.

Tables de hachage & dictionnaires

Le contrat d'un set est simple : savoir si une valeur existe, récupérer les données (ordre arbitraire), les retirer. Comme l'ordre n'est pas demandé, on en tire une garantie : on peut viser un accès en O(1).

On range chaque valeur à un indice prédictible via une fonction de hachage :

indice(valeur) = hachage(valeur) % taille(table)

Comme les valeurs possibles sont infinies et les indices finis, des collisions sont inévitables et doivent être gérées. Un set ainsi implémenté est un HashSet ; dès lors, un dictionnaire (clé → valeur en O(1)) devient trivial à construire.

Les arbres binaires de recherche

10 2 20 1 3 11 30 racine feuilles
Arbre équilibré : à chaque nœud, gauche < parent < droite. La recherche y est dichotomique, en O(log N).

Vocabulaire : la première valeur est la racine, les nœuds sont reliés par des branches, les feuilles sont les nœuds sans fils ; deux arbres forment une forêt. Un arbre est un graphe orienté acyclique.

Implémentation : par des nœuds à deux pointeurs (gauche, droit), ou par un tableau (fils gauche à l'indice 2i+1, fils droit à 2i+2).

Très sensible à l'ordre d'insertion : des données déjà triées donnent un arbre dégénéré (filiforme), équivalent à une liste chaînée → recherche en O(N). On préfère donc insérer des données randomisées. Un arbre équilibré / complet est optimal (O(log N)). Les arbres AVL et rouge-noir rééquilibrent automatiquement (vu en algorithmie avancée).

Les grands noms (et pourquoi)

NomPourquoi il est cité
Barbara Liskovinvente les types de données abstraits (1974) ; le principe de substitution de Liskov (le « L » de SOLID).
Donald Knuthinvente l'analyse de la complexité et la notation Big O dans The Art of Computer Programming (par « pollinisation » des maths).
Niklaus Wirth« Algorithms + Data Structures = Programs » ; la pensée architecturale : raisonner sur les abstractions sans considérer la machine.

À retenir : on décrit d'abord ce que fait une structure (le TDA, son contrat), puis on choisit comment l'implémenter — et la complexité Big O sert à comparer ces choix quand N grandit.

D'après le cours d'algorithmie (A. Roger, ENSICAEN). Fiche de révision personnelle.