Structures de données
Set et tables de hachage
On va regarder un peu la structure set de python et comparer ses performances avec la list. Un set est une structure qui représente un ensemble. C'est-à-dire que chaque valeur ne peut y être stockée qu'une seule fois. On le définit comme ça :
ou bien...
Il est aussi possible de créer un set à partir d'une liste.
Pour tester si une valeur appartient à un set, on utilise la syntaxe suivante, similaire à celle des listes.
Ci-dessous, la fonction du TP précédent qui tire un tableau aléatoire.
Tirez un tableau de taille 100 et construisez le set correspondant.
Comparez les performances de la recherche de valeurs en utilisant les commandes python "v in l" et "v in s". Puis faites de nouvelles comparaisons avec des tailles plus grandes.
Listes chainées
Ci-dessous un objet minimal pour représenter les listes chaînées en python
Vous n'avez pas besoin de comprendre entièrement ce code, ni même de maîtriser la programmation objet pour la suite du TP. Voilà comment vous pouvez l'utiliser.
Création d'une cellule :
Accès aux différents champs :
Création de la liste
Comme j'ai accroché c2 à c1, il me suffit de modifier L.premiere pour obtenir la liste contenant c1 puis c2.
Complétez les fonctions suivantes de façon à ce qu'elles correspondent à la documentation et passent les tests.
A présent qu'on sait insérer dans une liste triée. On peut implanter un algorithme de tri sur les listes : il suffit de récupérer les cellules une à une puis de insérer dans une nouvelle liste.
Quelle est la complexité de cet algorithme ? (double cliquez sur la question pour écrire votre réponse)
Par ailleurs, la façon dont nous avons écrit les fonctions fait qu'à chaque suppression, on ne récupère que la valeur et pas la cellule elle-même. On doit donc re-créer des cellules ce qui couteux en temps et en mémoire. Sauf si vous aviez déjà corrigé ce problème, modifiez votre fonction pour éviter la perte / re-création de cellule. Par exemple, vous pouvez écrire de nouvelles versions de ajoutTete et supprimeTete qui travaille sur les cellules et non plus les valeurs.
On cherche à faire la fusion de deux listes chaînées triées pour obtenir une troisième liste elle-même triée. Par exemple si on a :
Alors, la liste fusionnée devra être [1 -> 2 -> 2 -> 3 -> 3 -> 4 -> 5].
La fonction prendra deux listes en paramètres et retournera la liste résultat. Les cellules seront supprimées au fur et à mesure pour être ajoutées à la liste résultat. Donc à la fin, les listes L1 et L2 seront vides !
**Réfléchissez à un algortihme, puis implantez-le. Ecrivez aussi des tests vérifiant le résultat sur plusieurs exemples à l'aide de assert **.