Sto cercando un'idea per risolvere in modo efficiente il seguente problema:
Ho una serie di coppie di intervalli (intervallo = una coppia di numeri), ogni intervallo è univoco (ma ha le stesse dimensioni) ad es.
[
[(0,6),(34,40)],
[(1,7),(35,41)],
[(3,9),(12,18)],
[(2,8),(36,42)],
[(13,19),(22,28)],
[(23,29),(14,20)]
]
Ora mi piacerebbe combinare coppie di intervalli, se gli intervalli si sovrappongono, ad es.
[(0,6),(34,40)] overlaps with [(1,7),(35,41)] -result-> [(0,7),(34,41)]
Quindi come risultato per il set di cui sopra mi piacerebbe ottenere (ora ogni coppia può avere intervalli di dimensioni diverse)
[
[(0,8),(34,42)],
[(3,9),(12,18)],
[(13,20),(22,29)]
]
Il set potrebbe essere abbastanza grande, vorrei evitare la complessità quadratica se possibile.
EDIT: la mia migliore idea fino ad ora (in Python) è la seguente. Mi piacerebbe sapere se conosci un modo migliore (più veloce). Inoltre non sono sicuro se la mia idea di rimuovere coppie già combinate sia valida:
def ranges_overlap(range1, range2):
return range1[0] < range2[1] and range2[0] < range1[1]
def combine_pairs(pair1, pair2):
return [(min(r1[0], r2[0]), max(r1[1], r2[1])) for r1, r2 in zip(pair1, pair2)]
def combine_overlapping_pairs(pairs):
combined = []
while pairs:
pair1 = pairs.pop()
already_combined = []
for pair2 in pairs:
for pair2_perm in itertools.permutations(pair2):
does_overlap = True
for range1, range2 in zip(pair1, pair2_perm):
if not ranges_overlap(range1, range2):
does_overlap = False
break
if does_overlap:
pair1 = combine_pairs(pair1, pair2_perm)
already_combined.append(pair2)
break
combined.append(pair1)
# Not sure if I can do that
for pair in already_combined:
pairs.remove(pair)
return combined