Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes Gestion de Fichiers Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes
Resumé du cours d’aujourd’hui Modèle général pour l’implementation du traitement co-séquentiel: appariment et fusion de listes Illustration sur un problème de comptabilité Algorithmes de fusion de listes multiples Arbres de selections: arbres de gagnants et arbres de perdants FZR 8.1-8.3
Définition Les opérations co-séquentielles correspondent au traitement coordonné de deux (ou plus de deux) listes séquentielles afin de produire une liste unique. Ceci est utile pour la fusion des éléments des deux listes (union) et pour l’appariment (“matching”) de deux listes (intersection). Ces types de traitement de listes sont extrêmement utiles pour le traitement des fichiers.
Appariment des noms dans deux listes Adams Carter Chin Davis Foster Garwick James Johnson Karns Lambert Miller Adams Anderson Andrews Bech Burns Carter Davis Dempsey Gray James Johnson Katz Peters
Appariment des noms (suite) Algorithme (voir code aux Figures 8.2-8.4): Entrée: 2 listes triées et sans duplicatas Sortie: intersection des 2 listes Methode: -- lire l’élément initial de chacune des listes -- si un appariment est trouvé, le sortir, sinon chercher et garder le plus grands des éléments des 2 listes et continuer à chercher un appariment dans l’autre liste en stoppant à la fin de celle-ci; -- Répeter la 2ème étape jusqu’à la fin de l’une des 2 listes. Principaux points dans l’algorithme: Initialisation, accès au prochain élément des listes, synchronisation, condition de fin de liste (ou fichier) et reconnaissance et correction d’erreur.
Appariment des noms: synchronisation Elément(1): élément courant de la liste # 1 Elément(2): élément courant de la liste # 2 Règles: Si Elément(1) < Elément(2), se déplacer jusqu’à l’élément suivant de la liste # 1 Si Elément(1) > Elément(2), se déplacer jusqu’à l’élément suivant de la liste # 2 Si Elément(1)=Elément(2), sortir l’élément et se déplacer jusqu’à l’élément suivant des deux listes
Fusion de deux listes Le processus d’appariment peut être facilement modifié de façon à traiter la fusion de deux listes. Une différence importante entre l’appariment et la fusion est qu’avec la fusion, on doit lire les deux listes jusqu’au bout. Nous devons savoir reconnaitre, cependant, le fait que l’une des deux listes ait été complètement lue et éviter de lire cette liste de nouveau. Lire le code à la Figure 8.5.
Le modèle pour traitement co-séquentiel Assomptions: Deux ou plusieurs fichiers d’entrée; un ou plusieurs fichiers de sortie Les fichiers d’entrée sont triés selon une ou plusieurs clés et ordonnés suivant les mêmes clés Existance d’une méthode de traitement des fins de fichiers Le traitement des enregistrements se fait selon leur ordre logique Il n’y a qu’un enregistrement courant par fichier Les enregistrements ne peuvent être modifiés qu’en mémoire principale Composantes essentielles: initialisation, boucle de synchronisation, accès par clé au prochain enreg. des fichiers, condition de fin de fichie et reconnaissance et correction d’erreur.
Application du modèle Le problème: La création d’un programme de comptabilité contennant les composantes suivantes: Un fichier de transactions journalières: ce fichier contient les transactions d’un mois entier. Ces transactions sont ultimement reportées dans le fichier “livre de comptes” (Figure 8.7). Un fichier de livre de compte: ce fichier contient le resumé des transactions mensuelles associées avec chacun des comptes considerés (Figure 8.6). Un rapport correspond à l’association de chaque transaction à son compte dans le livre de compte (Figure 8.8).
Application du modèle (suite) Comment implémenter le procesus de rapport? Solution 1: Construire un indexe pour le livre de comptes organisé par numéro de compte 2 problemes: 1) beaucoup de recherche en avant et en arrière est nécessaire; 2) les inscriptions du journal ayant un compte en commun ne sont pas receuillies au même endroit. Solution 2: Receuillir toutes les transactions du journal ayant un compte en commun en triant les transactions du journal par numéro de compte, et traiter le livre de compte et le journal trié de façon co-séquentielle.
Application du modèle (suite) But du programme: produire une version imprimée du livre de compte qui montre la balance de départ et la balance courante pour chaque mois, ainsi que une liste de toutes les transactions du journal. Du point de vue du livre de compte, le processus de rapport est une opération de fusion (même les comptes non rencontrés dans le journal sont listés). Du point de vue des comptes du journal, le processus de rapport est un appariment. Notre programme doit donc implémenter une opération de fusion/appariment combinée tout en imprimant le nom de chaque compte, les transactions individuelles, et les balances.
Algorithme de Fusion de K listes Soit deux tableaux: Un tableau de k listes Un tableau de k indices correspondant a la valeur de l’element courant dans chacune des k listes, respectivement. Boucle principale de l’algorithme: Trouver l’indice de l’element courant minimum minElem Traiter minElem (mettre minElem dans la liste de sortie) For i=0 until i=k-1 (en increment de 1) Si l’element courant de la liste i est egal a minElem alors avancer la liste i Retourner a la premiere etape
Un Arbre de Selection pour Fusion d’un large nombre de listes L’algorithme de fusion pour k listes marche bien si k < 8. Si k est plus grand, le nonbre de comparaisons necessaires pour trouver la valeur minimal a chaque etape est tres grand. Dans ce cas il vaut mieux utiliser un arbre de selection qui nous permet de determiner une valeur de cle minimum plus rapidement. Fusionner k listes en utilisant cette methode prend log2 k (la profondeur de l’arbre) plutot que k. Cependant, la mise a jour d’un arbre de selection n’est pas facile Il est plus facile de mettre a jour un arbre de perdants.
Arbre de Perdants Plutot qu’ Arbre de Gagnants Avantage de l’arbre de perdants: Lorsque l’on utilise un arbre de gagnants, les enregistrements avec lesquels le gagnant doit etre compare—de facon a trouver le prochain gagnant—sont distribues dans des sous-arbres differents. Mettre a jour un tel arbre n’est pas tres facile. Lorsque l’on utilise un arbre de perdants, La valeur de chaque feuille (a part la plut petite, le gagnant) n’apparait qu’une seule fois dans un noeud interne. Tous les enregistrements avec lesquels le gagnant doit etre compare sont dans un cheminement de la feuille gagnante a la racine. Si chacun des noeuds de l’arbre a un pointeur a son parent, il est tres facile de trouver le gagnant suivant.