Informatique S4
Complexité, Approfondissement de la programmation en Python, Structures de données avancées et récursives
Équipe pédagogique Info CPP
Contacter l’enseignant:[email protected] À bookmarker:https://perso.crans.org/frenoy/infoCPPS4 2021
1
Contexte
• Informatique 6= science des ordinateurs
• Informatique 6= programmation
Informatique = Science du traitement de l’information(ce qui inclut – mais ne se limite pas à – la programmation, et n’est pas toujours lié à l’utilisation d’un ordinateur)
La programmation = utile dans d’autres domaines que
l’informatique (analyse et visualisation de données en sciences)⇒ fait partie du tronc commun essentiel à un futur scientifique
2
Contenu du semestre 4 Pré-requis :
• Contenu des deux précédents semestres (sauf BD)
• Programmation en Python, maitrise des outils associés (Spyder ? Éditeur de texte ? Ligne de commande ?)
• Livre : informatique pour tous en CPGE (disponible en ligne) Objectifs :
• Approfondissements en programmation ⇒ utilité générale
• Introduction à l’informatique théorique ⇒ déterminer si c’est un domaine “pour vous” (continuer dans une formation à dominante informatique ?)
• Compétences transversales : travail collaboratif (git ?), représentation graphique de données (matplotlib), rédaction d’un rapport (LATEX ?), outils unix (peut-être ?)
3
Plan du cours (2 amphis)
Complexité
Structures de données élémentaires Récursivité
Dictionnaires Arbres
Programmation avancée
4
Fonctionnement
Enseignements :
• 2 ×1,5h amphi
• 5 ×1,5h TD
• 7 ×1,5h TP ⇒ réalisation d’un projet Évaluation :
• 50 % examen écrit (contenu proche des TD)
• 50 % note de TP (projet)
Contact :[email protected]
5
Complexité
Rappels
• Complexité = coût de l’exécution d’un algorithme
• Dépend de la taille des entrées
• Ce coût s’exprime le plus souvent en terme de
• temps d’exécution(est-ce que cet algorithme va vite ?)
• mémoirenécessaire à l’exécution de l’algorithme
• On parle decomplexité en temps ou decomplexité en mémoire.
6
Calculs de coûts asymptotiques
Soientf,g ∈N→R+.
Déf.f ∈ O(g) ssi ∃c ∈R+,∃n0,∀n≥n0,f(n)≤c.g(n).
Exemple : n.(100.log(n) +√n) + 1000∈ O(n2).
Déf.f ∈Ω(g) ssi ∃c ∈R+\{0}, ∃n0,∀n≥n0,f(n)≥c.g(n).
Exemple : Recherche du max d’un tableau non trié àn éléments en Ω(n) comparaisons : l’algo naïf est optimal
Déf.f ∈Θ(g) ssi f ∈ O(g) etf ∈Ω(g).
Exemples : Pni=15.i ∈Θ(n2) et Pni=12i ∈Θ(2n).
Et comme logb(n) = logloga(n)
a(b), logb(n)∈Θ(loga(n))
7
Structures de données élémentaires
Tableaux
Vous connaissez déja les tableaux (informatique pour tous en CPGE :une suite de valeurs stockées dans des cases mémoire contigües)
⇒Structure de base existante dans (presque) tous les langages, correspondant directement à la structure de la mémoire de l’ordinateur
...2 341
1 -21
0 14
en Python, l’objetlist est plus ou moins un tableau
8
Tableaux (list) : utilisation
Rappel : quelles opérations élémentaires sur l’objetlist en Python connaissez-vous ?
• Créer une list
• Accéder à un élément
• Ajouter un élément à la fin
• Concaténer deux list
• Supprimer un élément
9
Piles
À faire à la maison pour le 3 février (TP 1) :lire les parties 1 et 2 du chapitre 12 (“Structure de pile”) d’informatique pour tous en CPGE.
10
Listes chaînées ?
Avancé (optionnel) :lire
https://fr.wikipedia.org/wiki/Liste_chaînée.
Si ça vous intéresse, exemple d’implémentation en C : https://openclassrooms.com/fr/courses/
19980-apprenez-a-programmer-en-c/
19733-les-listes-chainees.
11
Récursivité
Rappel : Fonction récursive = fonction qui s’appelle elle-même
def fact ( n ):
if n == 1:
r e t u r n 1
r e t u r n n * fact (n -1)
⇒Une autre façon d’exprimer un calcul (que la version itérative
“classique”)
def fibo ( n ):
if n == 0:
r e t u r n 0 if n == 1:
r e t u r n 1
r e t u r n fibo (n -1) + fibo (n -2)
⇒C’est parfois la version la plus intuitive (qui découle de la définition de l’objet)
12
Fonctionnement en arrière plan : empilement des appels
def fact ( n ):
if n == 1:
r e t u r n 1
r e t u r n n * fact (n -1)
n=3
fact(3)
n=3 n=2
fact(2)
n=3 n=2 n=1
fact(1)
n=3 n=2
return 1
n=3
return 2 return 6
13
La récursivité terminale
Observons cette fonction :
def pgcd (a , b ):
if b == 0:
r e t u r n a
r e t u r n pgcd (b , a % b )
a=24, b=16
pgcd(24,16)
a=16, b=8
pgcd(16,8)
a=8, b=0
pgcd(8,0) return 8 L’empilement des appels récursifs n’est pas nécessaire(mais cette optimisation n’est pas implémentée dans Python)
14
Structures de données récursives
Une structure de données peut être définie récursivement.
Quelques exemples :
Entiers naturels un entier naturel est :
• soit0
• soit lesuccesseurd’un autre entier naturel Liste chainée une liste d’entiers est :
• soit la liste vide
• soit un couple formé d’un entier et d’une liste Arbres binaires voir plus bas
15
Structures de données récursives ⇒ programmes récursifs
Exemple : addition de deux entiers avec la définition récursive
def add (a , b ):
if a == 0:
r e t u r n b e l s e:
# a = s u c c e s s e u r ( a0 )
r e t u r n add ( a0 , s u c c e s s e u r ( b ))
16
Dictionnaires
Introduction aux dictionnaires
Dictionnaire= ensemble fini de paires clé/valeur avec unicité des clés.
• Encode une fonction des clés vers les valeurs.
• Modifiable (comme unetable dans un SGBD).
• Généralise la notion de liste Python et de tableau en C : (index ⇒ clés, pas forcémentN, pas forcément consécutives).
• Implémentation optimisée pour obtenir ou modifier la valeur associée à une clé
17
Usage de base d’un dictionnaire
• Initialisation :
note = { " Toto " : 8 , " Arthur " : 20 , " Gaston " : 15}
pays = {( " Tintin " , 3): " Am é rique " , ( " Tintin " , 5): " Chine " }
• La clé est-elle présente ?
" Toto " in note # True ( " Tintin " , 4) in pays # False
• Lire/Modifier la valeur associée à la clé :
note [ " Gaston " ] = note [ " Toto " ]+2 # 10
pays [( " Tintin " , 4)] # erreur K e y E r r o r !
• Insérer des nouvelles clés/valeurs :
pays [( " Tintin " , 4)] = " Egypte "
pays [( " Asterix " , 3)] = " A l l e m a g n e "
• Supprimer une clé/valeur :
del note [ " Arthur " ] 18
Usage avancé
• Itérer sur les clés :
for k in note : p r i n t( k )
• Itérer sur les clés et les valeurs :
for k , v in note . items ():
p r i n t(k , v )
• Itérer sur les valeurs :
for v in note . values ():
p r i n t( v )
19
Utilité : Pourquoi pas une liste chainée ou un tableau ?
Imaginons : on dispose d’une liste de noms (la clé, chaines de caractères de 12 lettres ou moins), associés à une donnée (la valeur, par exemple une date de naissance ou une adresse postale).
On souhaite pouvoir ef ectuerrapidementdes opérations comme retrouver la date de naissance d’une personne à partir de son nom.
20