Cours : Python et algorithmique
Fiche de Cours : Python et Algorithmique (CPGE BCPST 1ère année)
Section titled “Fiche de Cours : Python et Algorithmique (CPGE BCPST 1ère année)”1. Introduction et rappels de syntaxe
Section titled “1. Introduction et rappels de syntaxe”Le langage Python est le langage support retenu pour le programme d’informatique en classe préparatoire BCPST. Il est impératif d’en maîtriser la syntaxe de base, le typage (dynamique mais rigoureux) ainsi que la structuration des données.
1.1. Les types de base et opérations
Section titled “1.1. Les types de base et opérations”- Booléens :
True,False. Opérateurs logiques :and,or,not. - Entiers (
int) et Flottants (float). Attention aux arrondis de représentation en machine (norme IEEE 754). - Chaînes de caractères (
str) : immuables.
1.2. Structures de contrôle
Section titled “1.2. Structures de contrôle”- Conditionnelles :
if condition1:# bloc 1elif condition2:# bloc 2else:# bloc 3
- Boucles borningées (
for) : Itération sur un itérable (souvent un range).for i in range(n): # de 0 à n-1# instructions - Boucles non bornées (
while) :while condition:# instructions
2. Structures de données usuelles
Section titled “2. Structures de données usuelles”En BCPST, l’utilisation optimale des structures de données est évaluée lors des colles et des épreuves pratiques.
2.1. Les listes (list)
Section titled “2.1. Les listes (list)”Tableaux dynamiques redimensionnables.
- Accès par indice : .
- Ajout en fin (
append) : amorti. - Insertion ou suppression en début/milieu (
insert,pop(0)) : .
2.2. Les dictionnaires (dict) et ensembles (set)
Section titled “2.2. Les dictionnaires (dict) et ensembles (set)”Basés sur des tables de hachage.
- Recherche, ajout, suppression dans un dictionnaire ou un ensemble : complexité en en moyenne.
3. Complexité algorithmique
Section titled “3. Complexité algorithmique”L’évaluation de la complexité d’un algorithme permet de quantifier l’utilisation des ressources (temps et mémoire) en fonction de la taille des données d’entrée.
3.1. Définitions (Notations de Landau)
Section titled “3.1. Définitions (Notations de Landau)”- Complexité temporelle : Nombre d’opérations élémentaires exécutées en fonction de .
- On utilise principalement les notations :
- : majoration asymptotique ( pour grand).
- : encodage asymptotique strict.
3.2. Exemples classiques
Section titled “3.2. Exemples classiques”- Recherche séquentielle dans une liste non triée :
- Pire des cas : parcourir tous les éléments .
- Recherche dichotomique dans une liste triée :
- À chaque étape, l’espace de recherche est divisé par .
- Nombre d’étapes tel que .
- Complexité : .
4. Algorithmique fondamentale
Section titled “4. Algorithmique fondamentale”4.1. Algorithmes de tri
Section titled “4.1. Algorithmes de tri”Les tris comparatifs usuels au programme :
- Tri par sélection : On cherche le minimum, on l’échange avec le premier, etc.
- Complexité temporelle : dans tous les cas.
- Tri par insertion : On insère chaque élément à sa place dans le sous-tableau déjà trié.
- Complexité temporelle : au pire, mais au meilleur des cas (liste déjà triée).
4.2. Diviser pour régner (Divide and Conquer)
Section titled “4.2. Diviser pour régner (Divide and Conquer)”Paradigme consistant à :
- Diviser le problème en sous-problèmes de plus petite taille.
- Régner en résolvant ces sous-problèmes récursivement.
- Combiner les solutions pour obtenir la solution du problème initial.
Exemple type : Le tri fusion (Merge Sort)
- Complexité : garantie au pire des cas.
5. Programmation impérative vs Récursivité
Section titled “5. Programmation impérative vs Récursivité”Une fonction récursive est une fonction qui s’appelle elle-même. Elle doit impérativement comporter :
- Un cas de base (condition d’arrêt) pour éviter une récursion infinie (et l’erreur
RecursionError). - Une progression vers le cas de base.
Exemple fondamental : Le calcul de la factorielle
def factorielle(n: int) -> int: """Calcule n! de manière récursive.""" # Cas de base if n == 0 or n == 1: return 1 # Appel récursif return n * factorielle(n - 1)La complexité en espace d’une fonction récursive linéaire est en en raison de l’empilement des contextes d’exécution dans la pile d’appels (call stack).