私は2台のマシンを持っており、それぞれのマシンに対して、開始点のリストとインターバルのエンドポイントのリストとして機能していたインターバルを持っています(たとえば[0,5,9] [3,6,13]は、マシンが時間0から3,5から6、および9から13まで作業していたことを示します)。オーバーラッピング間隔の決定
正確に1台のマシンが動作し、正確に2台のマシンが同時に動作している区間の開始点と終了点を計算する方法を決定したいと考えています。
たとえば、2番目のマシン間隔の開始点と終了点が[0,7]と[2,10]の場合、正確に1台のマシンが動作していた区間の開始点と終了点は[2,5,7 、[10]、[3,6,9,13]、正確に2つのマシンが動作していた区間の開始点と終了点は[0,9]、[2,10]です。
これを3台以上のマシンにも一般化できるようにしたいと考えています。
これは私が持っているものです。
overlapping_interval_starts = {}
overlapping_interval_ends = {}
whole_list = [(start, 's') for start in interval_starts] + [(end, 'e') for end in interval_ends]
whole_list.sort()
count = 1
if whole_list:
previous, _ = whole_list.pop(0)
for elt, elt_type in whole_list:
current = elt
if (count != 0) and (previous != current):
try:
overlapping_interval_starts[count].append(previous)
overlapping_interval_ends[count].append(current)
except KeyError:
overlapping_interval_starts[count] = [previous]
overlapping_interval_ends[count] = [current]
if elt_type == 's':
count += 1
else:
count -= 1
previous = current
それは私が持っている例の問題に取り組んでいますが、私はそれが一般的に正しい方法を確認するにはわかりません。次のような問題でそれを実行している。例えば
:
Machine 1: [2, 7], [6, 11]
Machine 2: [1, 5, 11], [3, 10, 13]
Machine 3: [2, 6], [5, 8]
利回り:
overlapping_interval_starts = {1: [1, 10, 11],
2: [3, 5, 6, 8],
3: [2, 7]}
overlapping_interval_ends = {1: [2, 11, 13],
2: [5, 6, 7, 10],
3: [3, 8]}
技術的に正しいですが、実際には10に2つの間隔(3〜7および8があるはずです2つのマシンが重なっている場所)。だから私はそれが一般的にうまくいくことを確かめる方法を見て苦労している。
代わりのポインタを求め、おそらくあなたはすでにあなたが解決策を考えるようにしようとしている方法を試してみましたかてきたものを教えて? –