GEF 243B Programmation informatique appliquée Décisions de design avec structures de données §15.1 – 15.2
21-Jan-14 2 JGA Beaulieu Revue Décrivez les étapes pour traverser une LC Décrivez les étapes pour éliminer un nœud Décrivez les étapes pour insérer un noeud
21-Jan-14 3 JGA Beaulieu Synopsis Structures de données ordonnées et désordonnées Tableaux ordonnés Tableaux désordonnés Listes chaînées désordonnées Listes chaînées ordonnées Choisir la bonne structure de données LC ordonnées avec plusieurs critères dordonnancement LC double
21-Jan-14 4 JGA Beaulieu Structures de données ordonnées et désordonnées Quand on veut utiliser des structures de données telles que les tableaux et les LC, il y a des compromis dans les temps dexécution que nous devons connaître Quand nous avons des séquences de struct, nous avons à faire deux décisions majeures basées sur ces compromis Sélection de la structure de données (tableaux ou LC) et Décider si on utilise une séquence ordonnée ou désordonnée
21-Jan-14 5 JGA Beaulieu Les éléments dans un tableau et une LC peuvent être ordonnés en utilisant une clé dans la structure Cette clé peut être nimporte quel champ dans la structure: surnom, prénom, numéro_de_collège, grandeur, pesanteur, NAS,… Lordonnancement peut aussi être faite avec une combinaison de deux clés: Par surnom (clé primaire) en premier et prénom ensuite (clé secondaire) Structures de données ordonnées et désordonnées
21-Jan-14 6 JGA Beaulieu Nous avons discutés que les tableaux ont des limitations sur la performance si nous voulons garder les éléments dans un ordre quelconque Les opérations dinsertion et délimination prennent un temps dexécution qui est proportionnel au nombre déléments dans le tableau Dans le pire cas, vous pourriez avoir à déplacer tout les éléments dans le tableau Cependant, la recherche dans un tableau ordonné peut être fait très rapidement avec une recherche binaire Tableaux ordonnés
21-Jan-14 7 JGA Beaulieu Tableaux de structures - rappel Éliminer un élément dans un tableau: Insérer un élément dans un tableau:
21-Jan-14 8 JGA Beaulieu Insertion déléments dans un tableau désordonné est très rapide; Vous mettez le nouvel élément à la fin du tableau dans la première case libre Pour que cela soit rapide, vous devez garder une variable qui contient la première case libre Les opérations de recherche et élimination dans un tableau en désordre sont cependant proportionnels au nombre déléments dans le tableau Tableaux désordonnés
21-Jan-14 9 JGA Beaulieu Les listes chaînées contrairement aux tableaux nont pas dindexes; donc même si votre LC est ordonnée, vous ne pouvez pas utiliser de recherche binaire Vous ne pouvez pas sauter au milieu de la LC parce quil ny a pas de nom symbolique pour chaque nœud Peut importe quelle décision de design que vous prenez pour lordonnancement de votre LC, vous devez toujours revenir à la tête de la liste et de passer de nœud à nœud pour toutes les opérations (recherche, insertion et élimination) Listes chaînées désordonnées
21-Jan JGA Beaulieu Il est évident que le temps de recherche dans une LC désordonnée est proportionnel au nombre déléments dans la liste. Lélimination dun nœud dans la LC est aussi proportionnelle au nombre déléments dans la liste (on doit trouver lélément avant déliminer) Linsertion dans une LC désordonnée est cependant très rapide – vous pouvez insérer à la tête ou à la queue immédiatement Le nombre déléments dans la liste naffecte pas cette opération Listes chaînées désordonnées
21-Jan JGA Beaulieu Si votre LC est ordonnée, alors vous pouvez arrêter de chercher aussitôt que vous avez trouvé votre structure(s) ou quand vous avez passé le point où la structure devrait être (vous savez alors quelle nest pas dans la liste) Si cest votre intention de chercher souvent (en comparaison avec linsertion ou lélimination des éléments), la liste chaînée ordonnée est une amélioration sur les LC désordonnées Mais encore dans le pire cas, vous pourriez avoir à traverser la LC au complet – e.i. cest encore proportionnel au nombre déléments dans la LC Liste Chaînées ordonnées
21-Jan JGA Beaulieu Si vous avez lintention dinsérer et déliminer beaucoup de nœud régulièrement et de faire relativement peu de recherches; utilisez une LC désordonnée Si lintention est de faire peu de changements dans votre séquence et de faire relativement beaucoup de recherches; il est mieux dutiliser un tableau ordonné. Vous devriez aussi avoir une bonne idée de la grandeur de votre tableau Choisir la bonne structure de données
21-Jan JGA Beaulieu Une des puissances des LC est dêtre capable dordonner la même LC de deux façons différentes, en utilisant deux pointeurs dans chaque nœud En fait vous pourriez utiliser N pointeurs dans chaque noeud pour ordonner de N différentes façons; Si vous voulez faire ceci avec des tableaux, vous allez avoir besoin de N tableaux ou bien de N opérations dordonnancement pour faire la même chose Ex.: Si je veux être capable dimprimer une liste ordonnée des étudiants du CMR par surnom ou numéro de collège, je pourrais utiliser une LC avec deux pointeurs pour garder ces relations LC ordonnée avec plusieurs critères dordonnancement
21-Jan JGA Beaulieu typedef struct JAMBON_NOEUD_ETUDIANT { char prenom[15]; char surnom[25]; unsigned long numeroDeCollege; float moyenne; struct JAMBON_NOEUD_ETUDIANT* pProchainNom; struct JAMBON_NOEUD_ETUDIANT* pProchainNum; } NOEUD_ETUDIANT; //nom du type STUDENT_NODE* pListeEtudiants = NULL; STUDENT_NODE* pListeNum = NULL; LC ordonnée avec plusieurs critères dordonnancement
Allard pProchainNum pProchainNom Allen pProchainNum pProchainNom Baar pProchainNum pProchainNom Alpo pProchainNum pProchainNom 0 0 pListeEtudiants pListeNum
21-Jan JGA Beaulieu LC Double Comme nous venons de le voir, il est possible davoir deux pointeurs pour créer deux LC pour le prix dune ou proche; le pointeur extra prend de la mémoire. On peut utiliser ce concept pour plus que lordonnancement. Une LC double est une liste chaînée qui peut être traversé dans les deux sens De la tête à la queue et de la queue à la tête Pour construire une LC double on inclus un pointeur prochain et un prédécesseur dans la structure de nœud Nous déclarons aussi un pointeur qui pointe à la queue similaire à la tête
21-Jan JGA Beaulieu typedef struct JAMBON_NOEUD_ETUDIANT { char prenom[15]; char surnom[25]; unsigned long numeroDeCollege; float moyenne; struct JAMBON_NOEUD_ETUDIANT* pProchain; struct JAMBON_NOEUD_ETUDIANT* pPrecedent; } NOEUD_ETUDIANT; //nom du type STUDENT_NODE* pTete = NULL; STUDENT_NODE* pQueue = NULL; LC double
Allard pPrecedent pProchain Allen pPrecedent pProchain Baar pPrecedent pProchain Alpo pPrecedent pProchain 0 0 pTete pQueue
21-Jan JGA Beaulieu LC Double Lopération de traverse est similaire à celle pour les LC simples mais elle est plus puissante parce que lon peut reculer Les opérations dinsertion et délimination doivent assigner des valeurs aux deux pointeurs, prochain et précédent Une petite augmentation en temps
21-Jan JGA Beaulieu Exercice Donnez le code pour enlever un nœud dune liste chaînée double. pTraverse pointe au nœud à enlever
21-Jan JGA Beaulieu Quiz Time Quelle genre de structure est-ce que je devrais utiliser si je veux garder en mémoire les membres du parlement et que je veux être capable de faire des recherches fréquentes? Ordonnée? Quelle genre de structure de données est-ce que je doit utiliser pour stocker les lettres que mon robot lit si je ne sais pas combien de lettres je vais lire? Ordonnée?