2016-10-21 7 views
0

私は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つのマシンが重なっている場所)。だから私はそれが一般的にうまくいくことを確かめる方法を見て苦労している。

+0

代わりのポインタを求め、おそらくあなたはすでにあなたが解決策を考えるようにしようとしている方法を試してみましたかてきたものを教えて? –

答えて

1

最初のタイムスタンプから開始して、タイムライン全体をステップ実行します。言い換えれば...

開始時間の異なるリストのすべての最小開始時間を取得します。この時点で開始するインターバルの間に、1つのマシンが動作しています。このマシンをMと呼んでください。

M以外のすべてのコンピュータの残りの開始時刻とMの終了時刻のうち、最小のタイムスタンプを見つけます。開始時刻の場合は、一度に作業するコンピュータの数を増やします。終了時であれば、動作しているコンピュータの数を減らします。

タイムスタンプがなくなるまでこれを続けます。開始時間が最小時間になるたびに、そのコンピュータの終了時間を調べるように切り替えます。終了時間が最小時間になるたびに、そのコンピュータの開始時間を調べるように切り替えます。

はここで可視化です:

Computer A:  0-----3 5-6  9-------13 
Computer B:  0---2   7-----10 
       ^
Minimum stamp: 0 
Number working: 1 
As of time:  0 

################################################## 

Computer A:  X-----3 5-6  9-------13 
Computer B:  0---2   7-----10 
       ^
Minimum stamp: 0 
Number working: 2 
As of time:  0 

################################################## 

Computer A:  X-----3 5-6  9-------13 
Computer B:  X---2   7-----10 
        ^
Minimum stamp:  2 
Number working: 2 1 
As of time:  0 2 

################################################## 

Computer A:  X-----3 5-6  9-------13 
Computer B:  X---X   7-----10 
        ^
Minimum stamp:  3 
Number working: 2 1 0 
As of time:  0 2 3 

################################################## 

Computer A:  X-----X 5-6  9-------13 
Computer B:  X---X   7-----10 
         ^
Minimum stamp:   5 
Number working: 2 1 0 1 
As of time:  0 2 3 5 

################################################## 

Computer A:  X-----X X-6  9-------13 
Computer B:  X---X   7-----10 
          ^
Minimum stamp:    6 
Number working: 2 1 0 1 0 
As of time:  0 2 3 5 6 

################################################## 

Computer A:  X-----X X-X  9-------13 
Computer B:  X---X   7-----10 
          ^
Minimum stamp:    7 
Number working: 2 1 0 1 0 1 
As of time:  0 2 3 5 6 7 

################################################## 

Computer A:  X-----X X-X  9-------13 
Computer B:  X---X   X-----10 
           ^
Minimum stamp:     9 
Number working: 2 1 0 1 0 1 2 
As of time:  0 2 3 5 6 7 9 

################################################## 

Computer A:  X-----X X-X  X-------13 
Computer B:  X---X   X-----10 
            ^
Minimum stamp:      10 
Number working: 2 1 0 1 0 1 2 1 
As of time:  0 2 3 5 6 7 9 10 

################################################## 

Computer A:  X-----X X-X  X-------13 
Computer B:  X---X   X-----XX 
             ^
Minimum stamp:       13 
Number working: 2 1 0 1 0 1 2 1  0 
As of time:  0 2 3 5 6 7 9 10 13 

################################################## 

Computer A:  X-----X X-X  X-------XX 
Computer B:  X---X   X-----XX 
Minimum stamp:        Done 
Number working: 2 1 0 1 0 1 2 1  0 
As of time:  0 2 3 5 6 7 9 10 13