IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Comparaison de Tableaux


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut Comparaison de Tableaux
    Bonjour,

    Quelqu'un connaitrait-il un algorithme permettant la comparaison de deux tableaux triés. Je m'explique:

    Les deux Tableaux ont chacun deux colonnes : la premiere représente un identifiant, la seconde un libellé

    L'algo doit permettre de :
    - recenser dans le deuxième tableau les nouveaux enregistrements (nouveaux identifiants)
    - recenser les enregistrements du premier tableau qui ont été supprimés
    - quand un enregistrement existe dans les deux tableaux, regarder s'il a été modifié (comparaison sur la colonne libellé)

    On m'a dit que c'était possible sur une seule passe, mais je ne trouve pas l'algo sur le net et ai du mal à le retrouver par moi-même

    Merci d'avance à ceux qui connaissent cet algo
    "Ne soyez rien, devenez sans cesse"

  2. #2
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Tes tableaux sont-ils TRIES par rapport à la 1ière colonne??
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  3. #3
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par Nemerle
    Tes tableaux sont-ils TRIES par rapport à la 1ière colonne??
    Oui c'est ça
    "Ne soyez rien, devenez sans cesse"

  4. #4
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Tu as 2 tableaux T1 et T2.Rapidement, tu prends deux entiers i=j=1:

    - tu regardes si T1.ID[i] = T2.ID[i].
    - Si oui, tu checkes si il y a eu modification du libellé. Ensuite tu fais i=i+1, j=j+1
    - Si non, il y a eu suppression! Ensuite tu fais i=i+1

    Quand tout T1 est lu, les éléments de T2 qui restent sont les nouveaux!
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  5. #5
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par Nemerle
    Tu as 2 tableaux T1 et T2.Rapidement, tu prends deux entiers i=j=1:

    - tu regardes si T1.ID[i] = T2.ID[i].
    - Si oui, tu checkes si il y a eu modification du libellé. Ensuite tu fais i=i+1, j=j+1
    - Si non, il y a eu suppression! Ensuite tu fais i=i+1

    Quand tout T1 est lu, les éléments de T2 qui restent sont les nouveaux!
    Imaginons l'apparition d'un nouvel élément dans le nouveau tableau (ici B):

    vieux(0, 0) = "A"
    vieux(1, 0) = "C"
    vieux(2, 0) = "D"
    vieux(3, 0) = "E"
    .....

    nouveau(0, 0) = "A"
    nouveau(1, 0) = "B"
    nouveau(2, 0) = "C"
    nouveau(3, 0) = "D"
    nouveau(4, 0) = "E"
    .....

    Premier coup A = A je verifie le libelle puis i+1 , j+1
    Deuxieme coup avec ta proposition : C <> B donc C a disparu ce qui est faux à cause de l'insertion de B qui a décalé C au rang suivant
    "Ne soyez rien, devenez sans cesse"

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    pseudocode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Ouvrir les 2 fichiers
     
    lire ligne vieux
             chercher dans nouveau si ligne
                    si NOT ligne
                           disparu
                    sinon
                        si ligne modifiée
                            modification
                        fin
                    fin
     
    stocker dernier id
     
    fermer vieux
     
    chercher dernier id vieux dans nouveau
    de (dernier id+1) à fin
             nouveau
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par souviron34
    pseudocode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Ouvrir les 2 fichiers
     
    lire ligne vieux
             chercher dans nouveau si ligne
                    si NOT ligne
                           disparu
                    sinon
                        si ligne modifiée
                            modification
                        fin
                    fin
     
    stocker dernier id
     
    fermer vieux
     
    chercher dernier id vieux dans nouveau
    de (dernier id+1) à fin
             nouveau
    J'ai pas testé mais ça semble interessant, à ceci près que tu n'indiques pas la récupération des nouveaux enregistrements. A fignoler donc.

    Pendant que tu postais, j'ai moi même reréfléchi au pb : solution dans post suivant
    "Ne soyez rien, devenez sans cesse"

  8. #8
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
        i = 0    ' Indice associé au vieux tableau
        j = 0    ' Indice associé au nouveau tableau
     
        'Recherche du tableau contenant le plus d'enregistrement
        ' ... imax ...
        ' ... jmax ...
     
        If imax > jmax Then
           max = imax
        Else
           max = jmax
        End If
     
        While i <> max And j <> max
          If vieux(i, 0) = nouveau(j, 0) Then
            If vieux(i, 1) = nouveau(i, 1) Then
              MsgBox "Enregistrement " & vieux(i, 0) & " identique"
            Else
              MsgBox "Enregistrement " & vieux(i, 0) & " modifié"
            End If
            i = i + 1
            j = j + 1
          ElseIf vieux(i, 0) < nouveau(j, 0) Then
            If vieux(i, 0) <> "" Then
              MsgBox "Enregistrement " & vieux(i, 0) & " supprimé"
              i = i + 1
            Else
              MsgBox "Enregistrement " & nouveau(j, 0) & " ajouté"
              j = j + 1
            End If
          ElseIf vieux(i, 0) > nouveau(j, 0) Then
            If nouveau(j, 0) <> "" Then
              MsgBox "Enregistrement " & nouveau(j, 0) & " ajouté"
              j = j + 1
            Else
              MsgBox "Enregistrement " & vieux(j, 0) & " supprimé"
              i = i + 1
            End If
          End If
        Wend
    Voilà ma solution ou je pense avoir géré les effets de bords (vieux tableau contient plus d'éléments que le nouveau et réciproquement).

    J'ai testé chez moi, ça semble OK, mais si vous voyez une grosse erreur n'hésitez pas à me taper sur les doigts
    "Ne soyez rien, devenez sans cesse"

  9. #9
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par Currahee
    Imaginons l'apparition d'un nouvel élément dans le nouveau tableau (ici B):

    vieux(0, 0) = "A"
    vieux(1, 0) = "C"
    vieux(2, 0) = "D"
    vieux(3, 0) = "E"
    .....

    nouveau(0, 0) = "A"
    nouveau(1, 0) = "B"
    nouveau(2, 0) = "C"
    nouveau(3, 0) = "D"
    nouveau(4, 0) = "E"
    .....

    Premier coup A = A je verifie le libelle puis i+1 , j+1
    Deuxieme coup avec ta proposition : C <> B donc C a disparu ce qui est faux à cause de l'insertion de B qui a décalé C au rang suivant
    ok, c'est pas la peine de Si c'est des VRAIS identifiants, tu ne peux pas créer un identifiant entre A et C

    Maintenant, si tu veux que je t'aide, car cet algo est tellement simple qu'un 1iere année d'info sait le faire, je peux rajouter 3 lignes pour fare fonctionner le truc. Ou bien je peux me brosser les cheveux...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Currahee
    J'ai pas testé mais ça semble interessant, à ceci près que tu n'indiques pas la récupération des nouveaux enregistrements. A fignoler donc.
    Faut lire jusqu'au bout
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par Nemerle
    ok, c'est pas la peine de Si c'est des VRAIS identifiants, tu ne peux pas créer un identifiant entre A et C

    Maintenant, si tu veux que je t'aide, car cet algo est tellement simple qu'un 1iere année d'info sait le faire, je peux rajouter 3 lignes pour fare fonctionner le truc. Ou bien je peux me brosser les cheveux...
    Cool le c'était pas méchant C'est simplement que l'algo proposé ne répondait totalement pas à ma recherche et que je me demandais si on s'était bien compris. Si j'avais mal exprimé ma demande, avec par exemple l'utilisation visiblement inappropriée à la situation du terme identifiant, je m'en excuse.

    Si ton algo était incomplet et que tu le savais, il suffisait de me dire "tiens base de l'algo à compléter"...

    J'ai réussi à mettre en forme l'algo que je désirai, je l'ai posté pour que les forumeurs en profitent, même si comme je l'ai mis dans mon premier post j'imagine bien évidemment que j'ai pas inventé la poudre, et que cet algo existe depuis des lustres... J'ai même suggéré que mon algo puisse être en partie faux car je ne suis pas un "vrai informaticien" et que donc des cas particuliers ont pu m'échapper...

    Je viens sur le forum demander gentiment de l'aide, j'essaye d'expliquer clairement ma demande, je poste la solution quand je la trouve par moi-même, je vois pas ou j'ai mérité une aggression...

    Merci pour ton aide,

    Cordialement
    "Ne soyez rien, devenez sans cesse"

  12. #12
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Pas de soucis, c'était juste pour te dire d'éviter les !! Je reprends:

    Tu as 2 tableaux T1 et T2.Rapidement, tu prends deux entiers i=j=1:

    - tu regardes si T1.ID[i] = T2.ID[i] :
    - Si oui, tu checkes si il y a eu modification du libellé. Ensuite tu fais i=i+1, j=j+1
    - Si non, tu regardes si T1.ID[i] < T2.ID[i] :
    - Si oui, il y a eu suppression! Ensuite tu fais i=i+1
    - Si non (on a donc T1.ID[i] > T2.ID[i]), il y a eu création dans T2. Tu fais j=j+1


    Si tu as fini T1 et qu'il reste des T2, ce sont des créations.
    Si tu as fini T2 et qu'il reste des T1, ce sont des suppressions.
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de tableaux
    Par Frog74 dans le forum VBA Access
    Réponses: 7
    Dernier message: 05/05/2008, 15h08
  2. Comparaison de tableaux (PERL + MYSQL + CISCO)
    Par pat94 dans le forum Langage
    Réponses: 5
    Dernier message: 05/10/2007, 15h06
  3. comparaison deux tableaux
    Par bezoindaidde dans le forum Langage
    Réponses: 13
    Dernier message: 06/07/2007, 15h51
  4. Comparaisons de tableaux sur des feuilles différentes
    Par Olanor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2007, 07h32
  5. [langage] Comparaison de tableaux
    Par WetzlarMan dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2004, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo