Tuve la misma pregunta cuando escribía un programa para mezclar muestras de audio (parcialmente superpuestas).
Lo que hice fue agregar un "evento de inicio" y "evento de detención" (para cada elemento) a una lista, ordenar la lista por punto de tiempo y luego procesarla en orden. Podrías hacer lo mismo, excepto usar un punto entero en lugar de un tiempo, y en lugar de mezclar sonidos estarías agregando símbolos al conjunto correspondiente a un rango. Si usted generaría rangos vacíos o simplemente los omitiría sería opcional.
Edit
Tal vez algo de código ...
# input = list of (start, stop, symbol) tuples
points = [] # list of (offset, plus/minus, symbol) tuples
for start,stop,symbol in input:
points.append((start,'+',symbol))
points.append((stop,'-',symbol))
points.sort()
ranges = [] # output list of (start, stop, symbol_set) tuples
current_set = set()
last_start = None
for offset,pm,symbol in points:
if pm == '+':
if last_start is not None:
#TODO avoid outputting empty or trivial ranges
ranges.append((last_start,offset-1,current_set))
current_set.add(symbol)
last_start = offset
elif pm == '-':
# Getting a minus without a last_start is unpossible here, so not handled
ranges.append((last_start,offset-1,current_set))
current_set.remove(symbol)
last_start = offset
# Finish off
if last_start is not None:
ranges.append((last_start,offset-1,current_set))
totalmente probado, obviamente.
Este es un duplicado de http://stackoverflow.com/questions/149577/need-an-algorithm-for-collapsing-netblock-ranges-into-lists-of-superset-ranges/149829#149829 (conservando el la información es trivial) – Camille