Utilisation des listes
Tableaux et listes
Matrices
- Utilité : à connaître car exercice classique réduction de complexité spatiale.
- Difficulté : facile
Tri par monotonies
Utilisation des listes pour faire grossir des tableaux.
Étant donné un tableau $T$, une monotonie est une suite croissante maximale d'éléments consécutifs de $T$. Par exemple : si $T = [2,6, 1,3, 3, 5,2,6, 4,0, 1,8,9,1,3, 2,0,1,0]$, alors $[2,6]$, $[1,3,3,5]$, $[2,6]$, $[4]$, $[0, 1,8,9]$, $[1,3]$, $[2]$, $[0,1]$ et $[0]$ sont les monotonies de $T$.
Donnez un algorithme qui, étant donné un tableau $T$ construit une liste (de listes) $L$, chaque élément de $L$ étant une monotonie de $T$ (et vice versa). À partir de notre exemple, on obtient : $L = [[2,6], [1,3,3,5],[2,6], [4], [0, 1,8,9], [1,3], [2] ,[0,1], [0]]$.
Donnez un algorithme qui fusionne deux monotonies ; par exemple, à partir de $[2,6]$ et $[1,3,3,5]$, on obtient $[1,2,3,3,5,6]$ (ceci est aussi une question de cours).
Donnez un algorithme qui, étant donnée une liste $L$ de monotonies, les fusionne deux-à-deux (en en laissant éventuellement une ``toute seule" à la fin) et met le résultat dans une liste (de listes) $L'$. Par exemple, à partir de $L = [[2,6], [1,3,3,5],[2,6], [4], [0, 1,8,9], [1,3], [2] ,[0,1], [0]]$, on obtient $L' = [[1,2,3,3,5,6], [2,4,6],[0,1,1,3,8,9], [0,1,2], [0]]$.
En déduire un algorithme de tri. Donnez sa complexité dans le cas le meilleur et dans le cas le pire.
Cet algorithme est en fait une variante d'un algorithme vu en cours. Lequel ?
Piles
- Utilité : les piles ça sert toujours. Ces exercices vous montrerons des cas classiques d'utilisation
- Difficulté : dur
File avec pile
On reprend l'exercice sur la création d'une file avec 2 piles.
Montrer que la complexité amortie d'ajout et de suppression d'un élément dans la structure de file créée avec 2 pile est en $\mathcal{O}(1)$
corrigé
corrigé
On procède comme pour le compteur, on associe une complexité amortie de +2 lorsque l'on empile dans P1 et de 0 lorsque l'on empile dans P2.
Parenthésage
Soit $C$ une expression arithmétique avec des parenthèses et des crochets. On cherche à savoir si le parenthésage est équilibré :
[3 + 3 * (1 + 3)]
sera Ok[3 + 3 * (1 + 3])
sera pas Ok
On ne vérifiera pas que l'expression est arithmétiquement correcte, c'est à dire que pour nous, [3 + + 3 (1 + 3)]
sera Ok.
Montrer que l'on peut utiliser une pile pour savoir si un parenthésage est équilibré entre les ()
et les []
.
corrigé
corrigé
algorithme parenthèse(C):
P ← une nouvelle pile de caractères
pour chaque c de C:
si c == "(" ou c == "[":
P.empile(c)
sinon si c == ")":
si P.vide() ou P.dépile() ≠ "(":
rendre Faux
sinon si c == "]":
si P.vide() ou P.dépile() ≠ "[":
rendre Faux
rendre Vrai
Calcul d'une expression avec deux piles
Soit $C$ une expression arithmétique avec uniquement des parenthèses, des +
et des *
. On suppose qu'elle est arithmétiquement correcte, comme (3 + 3 * (1 + 3))
Montrer que l'on peut utiliser deux piles (une pour les opérateurs et les parenthèses et l'autre pour les nombres) pour calculer $C$.
corrigé
corrigé
Il faut faire attention au fait que *
a une priorité supérieure à +
: 3 + 4 * 3 = 15
.
On lit l'expression de gauche à droite :
- si le caractère lu est un nombre on le place dans la pile P2
- sinon si le caractère lu est un opérateur O :
- on évalue l'expression comme on la fait avec la notation polonaise inversée :
- pop de P1 dans op
- pop de p2 dans y
- pop de p2 dans x
- x op y = z
- push de z dans P2
- jusqu'à ce que :
- P1 est vide ou
- l'opérateur O a une priorité supérieure à celle sur P1
- place O dans P1
- on évalue l'expression comme on la fait avec la notation polonaise inversée :
- sinon si le caractère lu est une parenthèse ouvrante : on la place dans P1
- sinon si le caractère lu est une parenthèse fermante :
- on évalue l'expression jusqu'à trouver une parenthèse ouvrante
- on push le résultat dans P2
Si on a fini de lire l'expression on évalue le reste des deux piles.
Liste chaînée
TBD dire base des algos récursifs. TBD donner le type récursif associé.
TBD reprendre exercices suppression/ head, tail , rendre éléments pair et impair/ retournements
Autre structures
- skip list
- listes triées : pas évident de pourquoi on fait ça : ie réduire le coup d'insertion. Reprendre l'idée du compteur. Exercice 3 : https://perso.ens-lyon.fr/laureline.pinault/Algo1/TD06-correction.pdf