Ich hatte die gleiche Frage beim Schreiben eines Programms zum Mischen (teilweise Überlappung) von Audio-Samples.
Was ich getan habe, war ein "Start-Ereignis" und "Stop-Ereignis" (für jedes Element) zu einer Liste hinzufügen, sortieren Sie die Liste nach Zeitpunkt, und dann in der Reihenfolge zu verarbeiten. Sie könnten dasselbe tun, außer dass Sie einen Integer-Punkt anstelle einer Zeit verwenden, und statt Sounds zu mischen, würden Sie dem Set, das einem Bereich entspricht, Symbole hinzufügen. Ob Sie leere Bereiche generieren oder einfach weglassen, wäre optional.
Edit
Vielleicht haben einige Code ...
# 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))
Völlig ungetestet, offensichtlich.
Dies ist ein Duplikat von http://stackoverflow.com/questions/149577/need-an-algorithm-for-collapsing-netblock-ranges-into-lists-of-superset-ranges/149829#149829 (die beibehalten Informationen sind trivial) – Camille