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.
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
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 !