Algorithmes et Structures de Données

✨ Niveau
🕗 Durée
💻 Pratique
Intermédiaire
4-8 mois
400+ exercices de code
Bienvenue dans un cours complet sur les algorithmes et les structures de données. À la fin de ce cours, vous aurez acquis suffisamment de connaissances pour optimiser grandement vos programmes, développer une intuition sur l’efficacité de chaque programme et réussir des entretiens dans de grandes entreprises technologiques comme Google, Meta, Amazon, etc. Le cours commence par les bases des algorithmes et des structures de données, puis approfondit les sujets les plus courants dans ce domaine.
notion image
notion image
Les grandes entreprises technologiques comme Google, Meta, Netflix et Amazon mènent leurs entretiens en vérifiant une connaissance approfondie des structures de données et des algorithmes. Terminer ce cours vous permettra d’être prêt pour ces entretiens.
Les plateformes de freelance comme Toptal ou Turing exigent également que leurs candidats maîtrisent les structures de données et les algorithmes. Leurs processus de sélection comprennent donc plusieurs entretiens centrés sur la connaissance algorithmique.

📚 Prérequis

Ce cours est conçu pour les personnes qui ont déjà des bases dans un langage de programmation généraliste (comme Python, C++, Java ou C#) et qui souhaitent se plonger dans l’univers des algorithmes et des structures de données. Avant de commencer, vous devriez être à l’aise avec les boucles, la création de fonctions et l’utilisation des structures de données intégrées (telles que les listes, ensembles ou dictionnaires).

🤩 Résultats

À l’issue de ce cours, vous saurez utiliser différentes structures de données populaires pour écrire des algorithmes efficaces qui seront bien plus rapides que des solutions naïves. Nous couvrirons les bonnes pratiques de code pour les algorithmes et nous verrons comment se préparer aux entretiens axés sur l’algorithmie.
Ce cours met l’accent sur la maîtrise de chaque concept. Vous allez donc travailler sur différents algorithmes et en implémenter plusieurs variantes pour résoudre de nombreux problèmes, afin de bien assimiler chacun d’entre eux.

💻 Apprendre en pratiquant

🔥
Le but d’apprendre les algorithmes n’est pas seulement de comprendre la théorie. Il s’agit de développer des compétences en résolution de problèmes.
Dans ce cours, vous apprenez en pratiquant ! Chaque concept est accompagné de plusieurs défis interactifs que vous devrez résoudre pour passer au suivant. En fait, ce cours propose plus de 400 exercices de programmation pratiques. Nous pensons que l’apprentissage par la pratique est le meilleur moyen d’acquérir une réelle maîtrise. Vous trouverez ici de nombreux exercices exigeants mais aussi intéressants pour vous entraîner sur chaque concept abordé.

⚡ Étudiez à votre rythme

Vous pouvez vous lancer à fond et boucler plusieurs niveaux en une semaine, ou prendre votre temps et approfondir chaque concept. À vous de choisir le rythme qui vous convient. La seule condition pour terminer le cours avec succès est la régularité. Consacrer 1 ou 2 heures chaque jour apporte beaucoup plus que travailler une seule fois par semaine pendant plusieurs heures.
Pour vous aider à ne pas rester bloqué, il existe un forum pour poser des questions. Vous pouvez y demander de l’aide ou épauler d’autres personnes en leur répondant sous chaque défi.

🎓 Programme

Ce cours aborde les concepts fondamentaux des structures de données et des algorithmes, et les présente de façon intuitive. Pour rendre l’apprentissage plus ludique et motivant, les notions sont organisées en niveaux : franchir un niveau atteste que vous avez maîtrisé un nouveau concept. Voici les principaux thèmes que nous allons traiter :
Problèmes d’implémentation
  • L’algorithme est décrit directement dans l’énoncé
  • Utilisation de structures de données de base comme les tableaux, dictionnaires, ensembles, etc.
Opérations au niveau binaire (Bitwise operations)
  • Représentation binaire des nombres (int → bin, bin → int)
  • Gestion des nombres négatifs en binaire
  • Opérations OR, AND, XOR
  • Représentation en base k (base-10 → base-k, base-k → base-10)
Prefix sums (Sommes préfixes)
  • Somme préfixe en 1D
  • Somme préfixe en 2D
Sliding window / Two pointers (Fenêtre glissante / Deux pointeurs)
  • Fenêtre glissante pour calculer une somme
  • Fenêtre glissante pour trouver des valeurs uniques
Théorie des nombres (Number theory)
  • Test de primalité - ,
  • Crible d’Ératosthène
  • Factorisation en nombres premiers
  • Plus grand commun diviseur (GCD) et plus petit commun multiple (LCM)
  • Arithmétique modulaire
Recherche binaire (Binary Search)
  • Recherche linéaire VS recherche binaire
  • Trouver une valeur dans un tableau trié à l’aide de la recherche binaire
  • Recherche d’un nombre à virgule flottante avec précision
  • Inclure l’intervalle à gauche VS inclure l’intervalle à droite dans la réponse
  • Recherche binaire de la réponse (binary search the answer)
Tri (Sorting)
  • Bogosort
  • Tri par sélection (Selection sort)
  • Tri par insertion (Insertion sort)
  • Tri à bulles (Bubble sort)
Algorithmes gloutons (Greedy Algorithms)
  • Appliquer une stratégie gloutonne
  • Heuristiques gloutonnes
Programmation Dynamique (Dynamic Programming)
  • Programmation dynamique 1D (Fibonacci, etc.)
  • Change de pièces (coin change) – trouver le nombre minimum de pièces
  • Change de pièces – trouver le nombre de combinaisons possibles
Récursion (Recursion)
  • Facteur de branchement
  • Code de Gray
  • Tours de Hanoï
  • Division récursive d’un problème en sous-problèmes
Diviser pour régner & Tri avancé (Divide & Conquer & Advanced Sorting)
  • Tri par fusion (Merge sort)
  • Tri rapide (Quick sort)
  • Tri en place
  • La complexité d’un tri par comparaisons est toujours ≥
Listes chaînées (Linked List)
  • Nœuds et liens
  • Parcours et recherche
  • Suppression et insertion d’éléments
File & Pile (Queue & Stack)
  • Ordres d’insertion et de retrait
  • Optimiser la recherche grâce à une pile
Arbre binaire & Arbre binaire de recherche (BST) (Binary Tree & BST)
  • Construction d’un arbre binaire
  • Recherche dans un arbre binaire
  • Mise à jour et suppression d’éléments dans un arbre
Tas (Heap)
  • Heapify
  • Tri par tas (Heap sort)
Hachage (Hashing)
  • Fonctions de hachage
  • Collisions
Programmation Dynamique Avancée (Advanced Dynamic Programming)
  • Distance d’édition (Edit Distance)
  • Problème du sac à dos (Knapsack problem)
  • Plus longue sous-séquence croissante (Longest Increasing Subsequence)
  • Multiplication efficace de n matrices
Représentations de graphes (Graph Representations)
  • Matrice d’adjacence
  • Liste d’adjacence
  • Liste d’arêtes
  • Degrés des sommets
Parcours en largeur (BFS, Breadth-First Search)
  • BFS sur des graphes
  • Recherche du chemin le plus court
  • BFS sur une grille
  • BFS sur d’autres structures
Parcours en profondeur (DFS, Depth-First Search)
  • Connexité
  • Cycles
  • Tri topologique
  • Bipartisme
Trie
  • Recherche de chaînes de caractères
Dijkstra
  • Recherche du plus court chemin dans un graphe pondéré
  • Astuces pour simplifier et améliorer le temps d’exécution
Backtracking
  • N reines (N Queens)
  • Coloration de graphes
  • Remplissage de grilles avec des valeurs
Arbre de segments (Segment Tree)
  • Arbre de segments simple – construction, obtention, mise à jour
  • Requêtes de plage et mises à jour de valeurs
  • Recherche binaire sur un préfixe
  • Stocker plusieurs valeurs dans un nœud
  • Prétraiter l’entrée puis utiliser un arbre de segments
Complexité algorithmique (Algorithm Complexity)
  • Notation Big formalisée
  • Problème P vs NP

🚀 Bienvenue

Apprendre est en grande partie un travail individuel. Achever ce cours sera votre réussite, et nous sommes là pour vous soutenir pendant votre parcours !