オーディオ サンプルをミックスする (部分的にオーバーラップする) プログラムを作成するときに、同じ質問がありました。
私がやったことは、リストに「開始イベント」と「停止イベント」を(アイテムごとに)追加し、リストを時点でソートしてから、順番に処理することでした。時間の代わりに整数ポイントを使用することを除いて、同じことを行うことができます。サウンドを混合する代わりに、範囲に対応するセットに記号を追加します。空の範囲を生成するか、単に省略するかはオプションです。
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))
明らかに、完全にテストされていません。