我有两台机器,每台机器都有一段时间间隔,它作为起点列表和间隔终点列表(例如[0,5,9]和[3] ,6,13]表示机器在0到3,5到6和9到13之间工作。
我想确定如何计算一台机器正好工作的间隔的起点和终点,而且正好两台机器在同一时间工作。
例如,如果第二个机器间隔的起点和终点是[0,7]和[2,10]那么正好一台机器工作的间隔的起点和终点是[2,5,7, 10]和[3,6,9,13]以及两台机器正在工作的间隔的起点和终点是[0,9]和[2,10]。
我希望能够将其概括为三台或更多台机器。
这就是我所拥有的:
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]}
技术上是正确的,但实际上只有两个机器重叠的间隔(3到7和8到10)。所以我很难看到我怎么能确定它的效果如何。
答案 0 :(得分:1)
从第一个时间戳开始,逐步完成整个时间轴。换句话说......
获取所有不同开始时间列表的最短开始时间。在此时开始的间隔期间,有一台机器工作,调用该机器。
在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