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.

martin97_A_wallpaper_with_formulas_math_and_connected_graph_wit_5dd4aca4-53a3-4f89-9a57-b4172fd477cc.jpg
top-tech-companies.png

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

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 !