2017-07-05 2 views
0

Disons que j'ai une liste de plages comme ceci:algorithme pour Intersection (ou fusion) de numérique Ranges

Liste A) 0 à 3, 9 à 14

Liste B) 1 à 4, 6 à 7, 14 à 16

liste C) 15 (soit 15 à 15)

Je voudrais obtenir une liste fusionnée de ces plages où le résultat ressemblerait à ceci:

fusionné Liste des résultats) 0 à 4, 6 à 7, 9 à 16

(notez que le résultat est une fusion/intersection/union des listes A, B et C)

Je suis sûr qu'il ya un algorithme pour cela, mais ont aucune idée . Est-ce que quelqu'un à déjà rencontré cela avant?

(pseudocode ou VB, serait génial)

Ajout d'une représentation visuelle:

enter image description here

+0

Voulez-vous fusionner fait rage dans une liste unique ou de toutes les listes (puis dans quel ordre). Aussi, votre liste C) "15" - qu'est-ce que cela signifie? Comment une seule valeur peut-elle spécifier une plage? –

+0

Le « 15 » est l'ensemble - il commence à 15 et se termine à 15. Je suppose que je pourrais l'avoir écrit comme: 15 à 15 (je vais mettre à jour la question pour en tenir compte). Le résultat est la fusion, ou union/intersection, des listes A, B et C. – swabygw

Répondre

3

Marque Tableau/Liste des paires (Value, Flag = +1 for start or -1 for end of range)

Trier ces paires par Value (utilisation Flag comme clé secondaire en cas d'égalité)

Faire Counter = 0

Promenade à travers tableau trié, en ajoutant Flag à Counter

Lorsque Counter devient non nul, la plage fusionnée commence.

Lorsque Counter devient zéro, la plage fusionnée se termine

post-scriptum Si vous souhaitez fusionner des intervalles « toucher » - compte pour Flag en fonction de comparaison lors du tri lorsque Value est le même - par exemple, (14;+1) avant (14,-1)

+0

Excellente idée - J'ai essayé et c'était proche. Voici le résultat que je suis arrivé: 0 à 4, 6 à 7, 9 à 14, 14 à 16 – swabygw

+0

solution a été ajoutée pour ce cas – MBo

+0

excellent - bien fait. – swabygw