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 :

Algo fusion d'intervalles


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut Algo fusion d'intervalles
    Salut,

    Voilà, j'ai des intervalles de temps représentés par 2 listes (liste temps début et une liste temps fin)

    Par exemple j'ai un intervalle de temps qui démarre à 1 seconde et finit à 3secondes, je note ça 1 3.

    Prenons différents intervalles
    1 3
    2 3
    4 5
    6 10
    9 11
    12 15
    13 16

    Je cherche un algo rapide et efficace, permettant de fusionner les intervalles qui peuvent l'être. Si on a un intervalle de 1 à 3 secondes et un autre de 2 à 3 secondes, je peux les unir. J'obtiens une liste minimale d'intervalles distincts

    1 3
    4 5
    6 11
    12 16

    Merci de votre aide

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Le mieux serait que tu commences par dire comment tu as commencé à l'envisager ? Il y a plusieurs façons de prendre le problème.

    PS : si tu bloques vraiment, que tu n'arrives pas à démarrer, demande toi comment toi tu le ferais, à la main.

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    A mon avis, le plus simple est de créer les fusions petit à petit.

    Tu prends le premier intervalle (ou au hasard).

    Et ensuite, tu prends les intervalles les uns à la suite des autres, et tu identifies quels sont les intervalles (ceux qui ont déjà été traités) qui chevauchent celui en cours de traitement. Tu fusionnes alors tous ceux qui se chevauchent (en y incluant celui qui est en cours de traitement).

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Commence par trier par ordre croissant du début de l'intervalle, ensuite le problème me semble trivial.

  5. #5
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Ecrire d'abord une fonction 'intersect' qui est un prédicat prenant en argument deux intervalles [a,b] et [c,d] et décidant s'ils se coupent ou non.
    Ecrire ensuite une fonction 'fusion' prenant en argument deux intervalles se coupant et retournant l'intevalle réunion.
    Organiser ensuite les intervalles en collection (tableau, liste, etc..)
    Comparer le premier à tous les autres et chaque fois qu'on trouve dans la liste des autres un intervalle qui 'intersect' le premier remplacer le premier par son union avec celui-ci et supprimer l'intervalle en question de la liste.
    A la fin du traitement on a un premier intervalle plus grand que le premier initial, et une liste plus courte que la liste initiale et ne comportant que des intervalles ne coupant pas le premier, il suffit alors d'itérer sur cette nouvelle liste.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    ou sinon, le désormais classique "sweep":

    Données d'entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #1 = 1 3
    #2 = 2 3
    #3 = 4 5
    #4 = 6 10
    #5 = 9 11
    #6 = 12 15
    #7 = 13 16
    Table de sweep
    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
     
    t    Actif au temps t
    ---------------------
    1    #1
    2    #1,#2
    3    #1,#2
    4    #3
    5    #3
    6    #4
    9    #4,#5
    10   #4,#5
    11   #5
    12   #6
    13   #6,#7
    15   #6,#7
    16   #7
    Les fusions possibles sont les entrées qui ont au moins 2 élements actifs:

    Fusion: (#1,#2)
    Fusion: (#4,#5)
    Fusion: (#6,#7)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    sinon, le désormais classique "sweep":
    J'ai pas compris, c'est quoi le sweep ?

    Attention, il y a des cas particuliers que j'ai découverts en faisant la même chose (avec des adresses IP au lieu de nombre mais c'est pareil)

    [5-10] peut fusionner avec [11-21]
    [1-4] peut fusionner avec [5-21]
    [1-21] peut fusionner avec [10-12]

    Citation Envoyé par Zavonen Voir le message
    A la fin du traitement on a un premier intervalle plus grand que le premier initial, et une liste plus courte que la liste initiale et ne comportant que des intervalles ne coupant pas le premier, il suffit alors d'itérer sur cette nouvelle liste.
    Pas tout à fait vrai

    A la fin du traitement on a un premier intervalle plus grand que le premier initial
    ==> oui
    une liste plus courte que la liste initiale
    ==> oui
    ne comportant que des intervalles ne coupant pas le premier
    ==> pas toujours

    ainsi:
    [1-10] [15-21] [10-16]
    A la fin de la 1ere itération on a:
    [1-16] [15-21]
    et il faut recommencer avec le 1er element pour tester avec les intervalles restant

    Je pense qu'il faut en plus que la collection initiale soit triée pour que ce que tu dis devienne vrai
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    A la fin du traitement on a un premier intervalle plus grand que le premier initial
    ==> oui
    une liste plus courte que la liste initiale
    ==> oui
    ne comportant que des intervalles ne coupant pas le premier
    ==> pas toujours
    Ta remarque est parfaitement vraie, mais cette dernière condition est inutile, elle est même stupide (autant pour moi), car elle signifie que l'algo s'arrête après la première itération.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  9. #9
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Ecrire d'abord une fonction 'intersect' qui est un prédicat prenant en argument deux intervalles [a,b] et [c,d] et décidant s'ils se coupent ou non.
    Ecrire ensuite une fonction 'fusion' prenant en argument deux intervalles se coupant et retournant l'intevalle réunion.
    Organiser ensuite les intervalles en collection (tableau, liste, etc..)
    Comparer le premier à tous les autres et chaque fois qu'on trouve dans la liste des autres un intervalle qui 'intersect' le premier remplacer le premier par son union avec celui-ci et supprimer l'intervalle en question de la liste.
    A la fin du traitement on a un premier intervalle plus grand que le premier initial, et une liste plus courte que la liste initiale et ne comportant que des intervalles ne coupant pas le premier, il suffit alors d'itérer sur cette nouvelle liste.
    Cet algorithme est en O(n^2), on peut faire du O(n log n) ou même du O(n) (si la liste est déjà triée (ce qui est préférable pour l'exploiter de tout façon), ou si on peut employer un tri en O(n)). On peut ensuite fusionner tant qu'on peut à un point de la liste puis passer au suivant si il n'y a plus de fusion possible. Par exemple en Haskell, on pourrait faire ça avec :
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    type Interval = (Int,Int)
     
    -- | This function takes a sorted (by lower born)
    -- | list of intervals and return a sorted list of 
    -- | intervals fused so that none overlaps
    fuse :: [Interval] -> [Interval]
    fuse = foldr merge []
        where merge i [] = [i]
              merge i@(b,e) iis@((b',e'):is) =
                  if b' < e+1
                  then (b,max e e'):is
                  else i:iis

    --
    Jedaï

  10. #10
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Cet algorithme est en O(n^2),
    Cet algorithme est en O(n^2), au pire !
    Car ce calcul néglige la disparition des intervalles fusionnés à chaque étape.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  11. #11
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Cet algorithme est en O(n^2), au pire !
    Car ce calcul néglige la disparition des intervalles fusionnés à chaque étape.
    L'algorithme est en Omega(n) et en O(n^2), je ne vois pas ce que rajouter "au pire" vient faire la-dedans. Il existe évidemment des cas où l'algorithme est bien en Théta(n^2) ne serait-ce que le cas où il n'y a pas de fusion (qui n'est peut-être pas si rare que ça, selon le domaine).

    De toute façon, l'algorithme que j'ai proposé est évidemment un raffinement de ton idée (et avait déjà été plus ou moins suggéré par plusieurs personnes dans le thread) qui ne peut qu'améliorer les choses.

    --
    Jedaï

Discussions similaires

  1. [Algo] Une question d'intervalle
    Par Jibees dans le forum Langage
    Réponses: 7
    Dernier message: 19/12/2006, 14h28
  2. cherche algos Delphi pour : Huffman, R.S.A, D.E.S.
    Par X-Delphi dans le forum Débuter
    Réponses: 3
    Dernier message: 24/08/2002, 18h51
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Recherche algo tree
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/05/2002, 13h44

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