From 5420735e8d9a21a1c5cff9442f88a583e2cb45d1 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Sun, 12 Dec 2021 21:47:02 +0100 Subject: [PATCH] moved part of 10 in 11 --- slides/cours_10.md | 235 -------------------------- slides/cours_11.md | 407 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 407 insertions(+), 235 deletions(-) create mode 100644 slides/cours_11.md diff --git a/slides/cours_10.md b/slides/cours_10.md index fa01a1a..abd57d4 100644 --- a/slides/cours_10.md +++ b/slides/cours_10.md @@ -319,238 +319,3 @@ int queue_dequeue(queue *fa) { ## Problème avec cette implémentation? -# Destruction - -## Comment on faire la désallocation? - -. . . - -On défile jusqu'à ce que la file soit vide! - -# Complexité - -## Quelle sont les complexité de: - -* Enfiler? - -. . . - -* Dépiler? - -. . . - -* Détruire? - -. . . - -* Est vide? - - -# Implémentation alternative - -## Comment implémenter la file auterment? - -. . . - -* Données stockées dans un tableau; -* Tableau de taille connue à la compilation ou pas (reallouable); -* `tail` seraient les indices du tableau; -* `capacity` seraient la capacité maximale; -* On *enfile* "au bout" du tableau, au défile au début (indice `0`). - -. . . - -## Structure de données - -```C -typedef struct _queue { - int *data; - int tail, capacity; -} queue; -``` - -# File basée sur un tableau - -* Initialisation? - -. . . - -```C - - - - -``` - -* Est vide? - -. . . - -```C - - - - -``` - - -* Empiler? - -. . . - -```C - - - - -``` - -* Dépiler? - -. . . - -```C - - - - -``` - -# Complexité - -## Quelle sont les complexité de: - -* Initialisation? - -. . . - -```C - - - - -``` - -* Est vide? - -. . . - -```C - -``` - - -* Empiler? - -. . . - -```C - - - - -``` - -* Dépiler? - -. . . - -```C - - - - -``` - -# Une file plus efficace - -## Comment faire une file plus efficace? - -* Où est-ce que ça coince? - -. . . - -* Défiler est particulièrement lent $\mathcal{O}(N)$. - -## Solution? - -. . . - -* Utiliser un indice séparé pour `head`. - -```C -typedef struct _queue { - int *data; - int head, tail, capacity; -} queue; -``` - - -# File basée sur un tableau (git) - -* Créons le squelette et `Makefile` ensemble. -* On doit choisir: cas simple ou cas compliqué? - -. . . - -* Créons quelques issues et assignons les! - -# Les listes triées - -Une liste chaînée triée est: - -* une liste chaînée -* dont les éléments sont insérés dans -l'ordre. - - - -. . . - -* L'insertion est faite telle que l'ordre est maintenu. - -## Quelle structure de données? - -```C - - - - - -``` - -# Les listes triées - -## Quelle structure de données? - - -Une liste chaînée bien sûr! - -```C -typedef struct _element { // chaque élément - int data; - struct _element *next; -} element; -typedef element* sorted_list; // la liste -``` - -## Fonctionnalités - -```C -// insertion de val -sorted_list sorted_list_push(sorted_list list, int val); -// la liste est-elle vide? -bool is_empty(sorted_list list); // list == NULL -// extraction de val (il disparaît) -sorted_list sorted_list_extract(sorted_list list, int val); - // rechercher un élément et le retourner -element* sorted_list_search(sorted_list list, int val); -``` - -# L'insertion - -# L'extraction - -# La recherche - -# Exercice: recherche sans position diff --git a/slides/cours_11.md b/slides/cours_11.md new file mode 100644 index 0000000..a1bb1ac --- /dev/null +++ b/slides/cours_11.md @@ -0,0 +1,407 @@ +--- +title: "Files d'attente et listes triées" +date: "2021-12-15" +patat: + eval: + tai: + command: fish + fragment: false + replace: true + ccc: + command: fish + fragment: false + replace: true + images: + backend: auto +... + +# La file d'attente (1/N) + +* Structure de données abstraite permettant le stockage d'éléments. +* *FIFO*: First In First Out, ou première entrée première sortie. +* Analogue de la vie "réelle"": + * File à un guichet, + * Serveur d'impressions, + * Mémoire tampon, ... + +## Fonctionnalités + + . . . + +* Enfiler, ajouter un élément à la fin de la file. +* Défiler, extraire un élément au devant de la file. +* Tester si la file est vide. + +. . . + +* Lire l'élément de la fin de la file. +* Lire l'élément du devant de la file. +* Créer une liste vide. +* Détruire une liste vide. + +# La file d'attente (2/N) + +## Implémentation possible + +* La structure file, contient un pointeur vers la tête et un vers la queue. +* Entre les deux, les éléments sont stockés dans une liste chaînée (comme une + pile). + + + +## Structure de données en C? + +. . . + +```C +txpedef struct _element { // Elément de liste + int data; + struct _element* next; +} element; + +typedef struct _queue { // File d'attente: + element* head; // tête de file d'attente + element* tail; // queue de file d'attente +} queue; +``` + +# Fonctionnalités d'une file d'attente (gitlab) + +## Creation et consultations + +. . . + +```C +void queue_init(queue *fa); // head = tail = NULL +bool queue_is_empty(queue fa); // fa.head == fa.tail == NULL +int queue_tail(queue fa); // return fa.head->data +int queue_head(queue fa); // return fa.tail->data +``` + +## Manipulations et destruction + +. . . + +```C +void queue_enqueue(queue *fa, int val); // adds an element before the tail +int queue_dequeue(queue *fa); // removes the head and returns stored value +void queue_destroy(queue *fa); // dequeues everything into oblivion +``` + +# Enfilage + +## Deux cas différents: + +1. La file est vide (faire un dessin): + +. . . + +{width=40%} + +2. La file n'est pas vide (faire un dessin): + +. . . + +{width=70%} + +# Enfilage + +## Live (implémentation) + +. . . + +```C +void queue_enqueue(queue *fa, int val) { + element elmt = malloc(sizeof(*elmt)); + elmt->data = val; + elmt->next = NULL; + if (queue_is_empty(*fa)) { + fa->head = elmt; + fa->tail = elmt; + } else { + fa->tail->next = elmt; + fa->tail = elmt; + } +} +``` + +# Défilage + +## Trois cas différents + +1. La file a plus d'un élément (faire un dessin): + +. . . + +{width=80%} + +2. La file un seul élément (faire un dessin): + +. . . + +{width=25%} + + +3. La file est vide (problème) + +# Défilage + +## Live (implémentation) + +. . . + +```C +int queue_dequeue(queue *fa) { + elmt = fa->head; + int val = elmt->data; + fa->head = fa->head->next; + free(elmt); + if (NULL == fa->head) { + fa->tail = NULL; + } + return val; +} +``` + +. . . + +## Problème avec cette implémentation? + +# Destruction + +## Comment on faire la désallocation? + +. . . + +On défile jusqu'à ce que la file soit vide! + +# Complexité + +## Quelle sont les complexité de: + +* Enfiler? + +. . . + +* Dépiler? + +. . . + +* Détruire? + +. . . + +* Est vide? + + +# Implémentation alternative + +## Comment implémenter la file auterment? + +. . . + +* Données stockées dans un tableau; +* Tableau de taille connue à la compilation ou pas (reallouable); +* `tail` seraient les indices du tableau; +* `capacity` seraient la capacité maximale; +* On *enfile* "au bout" du tableau, au défile au début (indice `0`). + +. . . + +## Structure de données + +```C +typedef struct _queue { + int *data; + int tail, capacity; +} queue; +``` + +# File basée sur un tableau + +* Initialisation? + +. . . + +```C + + + + +``` + +* Est vide? + +. . . + +```C + + + + +``` + + +* Empiler? + +. . . + +```C + + + + +``` + +* Dépiler? + +. . . + +```C + + + + +``` + +# Complexité + +## Quelle sont les complexité de: + +* Initialisation? + +. . . + +```C + + + + +``` + +* Est vide? + +. . . + +```C + +``` + + +* Empiler? + +. . . + +```C + + + + +``` + +* Dépiler? + +. . . + +```C + + + + +``` + +# Une file plus efficace + +## Comment faire une file plus efficace? + +* Où est-ce que ça coince? + +. . . + +* Défiler est particulièrement lent $\mathcal{O}(N)$. + +## Solution? + +. . . + +* Utiliser un indice séparé pour `head`. + +```C +typedef struct _queue { + int *data; + int head, tail, capacity; +} queue; +``` + + +# File basée sur un tableau (git) + +* Créons le squelette et `Makefile` ensemble. +* On doit choisir: cas simple ou cas compliqué? + +. . . + +* Créons quelques issues et assignons les! + +# Les listes triées + +Une liste chaînée triée est: + +* une liste chaînée +* dont les éléments sont insérés dans +l'ordre. + + + +. . . + +* L'insertion est faite telle que l'ordre est maintenu. + +## Quelle structure de données? + +```C + + + + + +``` + +# Les listes triées + +## Quelle structure de données? + + +Une liste chaînée bien sûr! + +```C +typedef struct _element { // chaque élément + int data; + struct _element *next; +} element; +typedef element* sorted_list; // la liste +``` + +## Fonctionnalités + +```C +// insertion de val +sorted_list sorted_list_push(sorted_list list, int val); +// la liste est-elle vide? +bool is_empty(sorted_list list); // list == NULL +// extraction de val (il disparaît) +sorted_list sorted_list_extract(sorted_list list, int val); + // rechercher un élément et le retourner +element* sorted_list_search(sorted_list list, int val); +``` + +# L'insertion + +# L'extraction + +# La recherche + +# Exercice: recherche sans position -- GitLab