aboutsummaryrefslogtreecommitdiff
path: root/semestre 3/structures des données
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-09-13 00:16:52 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-09-13 00:16:52 +0200
commit11d5e7431489b8b40cf479a7f88c171d6fbf77a7 (patch)
tree2d4ba135fb41cddf5b717577a9f71257ffdf409d /semestre 3/structures des données
parent53eb16d66931e56c6682059074dbe76c13ada4e0 (diff)
Cours du 08 au 12 septembre
Diffstat (limited to 'semestre 3/structures des données')
-rw-r--r--semestre 3/structures des données/1- Notions élémentaires.md138
1 files changed, 138 insertions, 0 deletions
diff --git a/semestre 3/structures des données/1- Notions élémentaires.md b/semestre 3/structures des données/1- Notions élémentaires.md
new file mode 100644
index 0000000..06005d8
--- /dev/null
+++ b/semestre 3/structures des données/1- Notions élémentaires.md
@@ -0,0 +1,138 @@
+---
+tags:
+ - sorbonne
+ - informatique
+semestre: 3
+---
+Comment gérer les structures de données ?
+-> objectif est d'optimiser
+|> références bibliographiques sur Moodle
+
+Note : 50% examen, 30% TME Solo final, 10% TME Solo, 10% note TD
+|> règle du max particulière : $\max(0.5\mathrm{examen}+0.1\mathrm{TD}+0.1\mathrm{TP},0.7\mathrm{examen})$
+-> TME Solo final est gardé en seconde session
+
+Une feuille A4 manuscrite est autorisée en examen
+## Abstraction
+Une structure de données est une implémentation concrète d'un type abstrait de données
+
+Abstraction = considérer l'un caractère d'une chose indépendamment des autres
+|> abstraction par simplification -> réduction la description d'un objet
+|> abstraction par généralisation -> partir du particulier pour arriver au cas général
+
+Abstraction en informatique = synthétiser les caractéristiques communes applicables à des entités ou concepts variés, afin de simplifier et unifier leur manipulation
+
+> [!note] Abstraction est une bonne chose
+> Mais il ne doit pas rendre le programme plus lent !
+
+Un type abstrait de données est une spécification mathématique d'un ensemble d'objets et d'un ensemble d'opérations applicables à ces objets
+
+Le type abstrait ne définit pas l'implémentation des méthodes ou la manière dont les données sont stockées
+-> permet de rendre le code plus abstrait pour mieux le comprendre
+
+Une structure de données représente concrètement les données dans la mémoire
+|> elle implémente les opérations sur cette représentation
+
+Le choix de la structure de données implique un coup
+|> coup spatiale (mémoire que ça prend)
+|> coup temporel (temps que ça prend)
+-> toutes les structures de données n'ont pas les mêmes performances
+
+Un programme est un ensemble :
+- de variables
+- d'opérations élémentaires
+- de structures de contrôle
+
+Variable = une boite contenant des données
+Opération élémentaires = opération réalisant quelque chose de simple (ordinateur les faits en un nombre fini d'appels au CPU)
+Structure de contrôle = instruction décrivant comment le programme s'exécute
+
+Un algorithme est un programme résolvant un problème
+|> problème = valeurs + question
+-> doit avoir un nombre fini d'opérations élémentaires (terminaison)
+-> doit répondre correctement à la question (vérification)
+## Complexité
+On estime la complexité temporelle en comptant le nombre d'opérations élémentaires faites
+|> selon les entrées, il peut y avoir une complexité temporelle -> on regarde donc le pire des cas et le meilleur des cas
+
+**Notation de Landau : $O$**
+Soient $f(n)$ et $g(n)$ deux fonctions positives définies sur $\mathbb{N}$.
+On dit que $f(n)$ est en $O(g(n))$ si la fonction $f$ est asymptotiquement bornée supérieurement par la fonction $g$ à un facteur près. Plus formellement, $f(n)$ est en $O(g(n))$ si :
+$$ \exists n_0\in\mathbb{N},\quad\exists k\in\mathbb{R}>0,\quad\forall n \geqslant n_0,\quad f(n)\leqslant kg(n) $$
+
+> [!NOTE] Simplification de la notation
+> Quand on a $O(2n+4)$, on peut noter $O(n)$ car :
+> - $2n+4\leqslant kn$ pour tout $n$ et pour tout $k > 4$
+>
+> Cette simplification est valide pour tous les cas similaires
+
+**Notation de Landau : $\Omega$**
+Soient $f(n)$ et $g(n)$ deux fonctions positives définies sur $\mathbb{N}$.
+On dit que $f(n)$ est en $\Omega(g(n))$ si la fonction $f$ est asymptotiquement bornée inférieurement par la fonction $g$ à un facteur près. Plus formellement, $f(n)$ est en $\Omega(g(n))$ si :
+$$ \exists n_0\in\mathbb{N},\quad\exists k\in\mathbb{R}>0,\quad\forall n \geqslant n_0,\quad f(n)\geqslant kg(n) $$
+
+> [!NOTE] Simplification de la notation
+> Même principe !
+
+**Notation de Landau : $\Theta$**
+Soient $f(n)$ et $g(n)$ deux fonctions positives définies sur $\mathbb{N}$.
+On dit que $f(n)$ est en $\Theta(g(n))$ si la fonction $f$ est dominée et soumise par la fonction $g$ asymptotiquement. Plus formellement, $f(n)$ est en $\Theta(g(n))$ si :
+$$ \exists n_0\in\mathbb{N},\quad\exists (k_2,k_1)\in\mathbb{R}^2,\quad k_2\geqslant k_1>0\quad\implies\quad\forall n \geqslant n_0,\quad k_1g(n)\leqslant f(n)\leqslant k_2g(n) $$
+
+La complexité spatiale est la place que prend un programme en mémoire
+|> est l'analogue de la complexité temporelle pour la RAM
+## Compilation et module en C
+Programmation modulaire est le fait de séparer son code en plusieurs programmes
+-> demande une réflexion sur le découpage du code
+
+Un module en C est composé :
+- du header `.h` qui donne les interfaces du module
+- du fichier source `.c` qui contient le code source décrit dans le fichier header
+
+Besoin de rajouter `#include "file.h"` en début pour implémenter le header
+
+Quand on écrit un fichier header, on rajoute toujours :
+```c
+#ifndef FILE_H
+#define FILE_H
+
+// contenu du fichier
+
+#endif
+```
+Ça permet d'éviter d'avoir des erreurs lors de la compilation
+|> éviter d'inclure plusieurs fois le même chode
+
+On peut compiler les fichiers seuls avec :
+```bash
+gcc -c file1.c # crée le fichier1.o
+gcc -c file2.c # crée le fichier2.o
+gcc -c main.c # crée le main.o
+```
+Et on peut créer l'exécutable `main` avec :
+```bash
+gcc -o main -c main.o fil2.o file1.o
+```
+Ceci permet de compiler le programme en plusieurs fois -> permet de gagner du temps si le projet est long à compiler
+
+Le `Makefile` permet d'automatiser tout ça
+|> il exécute uniquement ce qui est nécessaire
+|> évaluation récursive des règles (voir le diapo pour plus d'infos)
+```Makefile
+build : main // peut utile car on n'a qu'un seul exécutable
+
+main : main.o file2.o file1.o
+ gcc -o main -c main.o file2.o file1.o
+
+main.o:
+ gcc -c main.c
+
+file2.o:
+ gcc -c file2.c
+
+file.o:
+ gcc -c file1.c
+
+clean:
+ rm -f *.o main
+```