У меня был такой же вопрос при написании программы для смешивания (частично перекрывающихся) звуковых образцов.
Что я сделал, это добавить в список «событие запуска» и «остановить событие» (для каждого элемента), отсортировать список по времени, а затем обработать его по порядку. Вы можете сделать то же самое, за исключением использования целочисленной точки вместо времени, и вместо того, чтобы смешивать звуки, вы добавляете символы в набор, соответствующий диапазону. Если вы создадите пустые диапазоны или просто опустите их, это будет необязательным.
Edit
Возможно, какой-то код ...
# 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))
Полностью тестировался, очевидно.
Это дубликат http://stackoverflow.com/questions/149577/need-an-algorithm-for-collapsing-netblock-ranges-into-lists-of-superset-ranges/149829#149829 (сохраняющий информация тривиальна) – Camille