Cours : Algorithmique et Programmation
Fiche de Cours : Algorithmique et Programmation (CPGE BCPST 1ère année)
Section titled “Fiche de Cours : Algorithmique et Programmation (CPGE BCPST 1ère année)”1. Introduction et Fondamentaux
Section titled “1. Introduction et Fondamentaux”L’informatique en BCPST repose sur l’utilisation du langage Python (version ). Un algorithme est une suite finie et non ambigüe d’instructions permettant de résoudre un problème.
Définition : Complexité algorithmique
Section titled “Définition : Complexité algorithmique”Soit la taille des données d’entrée (par exemple, le nombre d’éléments d’une liste). La complexité temporelle (resp. spatiale ) représente le nombre d’opérations élémentaires (resp. l’espace mémoire) nécessaires à l’exécution de l’algorithme, exprimé à l’aide des notations de Landau ().
Rappel mathématique (Ordres de grandeur usuels) :
- : Complexité constante.
- : Complexité logarithmique (ex: dichotomie).
- : Complexité linéaire (ex: parcours de liste).
- : Complexité quasi-linéaire (ex: tri fusion).
- : Complexité quadratique (ex: tri par insertion).
2. Structures de Données usuelles en Python
Section titled “2. Structures de Données usuelles en Python”A. Les Listes (list)
Section titled “A. Les Listes (list)”- Représentation dynamique en mémoire (tableau de pointeurs).
- Accès par indice : .
- Ajout en fin de liste (
append) : en moyenne. - Insertion ou suppression au début/milieu (
insert,pop(0)) : car nécessite le décalage de tous les éléments suivants.
B. Les Dictionnaires (dict)
Section titled “B. Les Dictionnaires (dict)”- Implémentation par table de hachage.
- Recherche, insertion, suppression par clé : en moyenne.
3. Algorithmes de Tri
Section titled “3. Algorithmes de Tri”A. Tri par sélection (Complexité )
Section titled “A. Tri par sélection (Complexité O(n2)\mathcal{O}(n^2)O(n2))”Recherche du minimum dans la sous-liste non triée et échange avec le premier élément.
def tri_selection(T): n = len(T) for i in range(n - 1): mini = i for j in range(i + 1, n): if T[j] < T[mini]: mini = j if mini != i: T[i], T[mini] = T[mini], T[i] return TB. Tri par insertion (Complexité , dans le meilleur des cas)
Section titled “B. Tri par insertion (Complexité O(n2)\mathcal{O}(n^2)O(n2), O(n)\mathcal{O}(n)O(n) dans le meilleur des cas)”Insère chaque élément à sa place dans la sous-liste déjà triée située à gauche.
def tri_insertion(T): for i in range(1, len(T)): val = T[i] j = i while j > 0 and T[j - 1] > val: T[j] = T[j - 1] j -= 1 T[j] = val return T4. Recherche et Diviser pour Régner
Section titled “4. Recherche et Diviser pour Régner”A. Recherche dichotomique (Tableau trié)
Section titled “A. Recherche dichotomique (Tableau trié)”Principe : Diviser par deux l’espace de recherche à chaque étape.
def dichotomie(T, x): gauche, droite = 0, len(T) - 1 while gauche <= droite: milieu = (gauche + droite) // 2 if T[milieu] == x: return milieu elif T[milieu] < x: gauche = milieu + 1 else: droite = milieu - 1 return NoneThéorème : La complexité temporelle de la recherche dichotomique est .
5. Méthodes et Bonnes Pratiques en BCPST
Section titled “5. Méthodes et Bonnes Pratiques en BCPST”- Documentation et Typage : Toujours documenter ses fonctions via des docstrings et utiliser des assertions (
assert) pour valider les préconditions. - Invariants de boucle : Pour prouver la correction d’un algorithme itératif, il faut formuler un invariant (propriété vraie avant et après chaque itération) et vérifier son initialisation, sa conservation et sa terminaison.
- Récursivité : Toute fonction récursive doit posséder un cas de base (condition d’arrêt) et une progression vers le cas de base (décroissance d’un paramètre entier par exemple).
6. Pièges à Éviter (Avertissements du Professorat)
Section titled “6. Pièges à Éviter (Avertissements du Professorat)”- Attention aux effets de bord (Alias) : En Python, l’affectation d’une liste à une autre (
L2 = L1) crée un simple alias. Toute modification deL2modifieL1. Préférer la copie superficielle (L2 = list(L1)ouL2 = L1[:]). - Complexité cachée : Utiliser l’opérateur
insur une liste (complexité ) dans une boucle de parcours (complexité ) conduit à un algorithme en . Pour des tests d’appartenance fréquents, utiliser unsetou undict(). - Terminaison : Veiller à ce que les boucles
whiledisposent d’une condition d’arrêt strictement décroissante (variant de boucle) pour éviter les boucles infinies.