Algorithm 检测重叠时段(或时间范围)的最快方法
假设我有很多时间段是通过开始和结束时间戳标识的。检测wich周期重叠的最快方法是什么 这里有一个例子: 9个不同的时段,由起始(开始)和结束(结束)时间戳分隔Algorithm 检测重叠时段(或时间范围)的最快方法,algorithm,sorting,Algorithm,Sorting,假设我有很多时间段是通过开始和结束时间戳标识的。检测wich周期重叠的最快方法是什么 这里有一个例子: 9个不同的时段,由起始(开始)和结束(结束)时间戳分隔 A = [ from : 7s , to : 11s] B = [ from : 1s, to : 8s] C = [ from : 9s, to : 12s] D = [ from : 4s, to : 7s] E = [ from 10s, to: 15s] F = [ from 0s, to : 5s] G (oops i ski
A = [ from : 7s , to : 11s]
B = [ from : 1s, to : 8s]
C = [ from : 9s, to : 12s]
D = [ from : 4s, to : 7s]
E = [ from 10s, to: 15s]
F = [ from 0s, to : 5s]
G (oops i skipped it when drawing the image!)
H = [ from: 5s, to: 9s]
I = [ from: 11s, to: 13s]
J = [ from: 7s, to: 14s]
如何尽可能快地检索所有重叠的时段以获得以下结果
[A,B]、[A,C]、[A,E]、[A,H]、[A,J]、[B,D]、[B,F]、[B,H]、[B,J]、[C,E]、[C,J]、[D,F]、[D,H]、[D,J]、[E,I,J]]
还有另一个类似的JSFIDLE,但这次有实时时间戳,从2017年1月到3月,美国东部夏令时上午8点到下午18点,有很多
如果有人能找到一个更快的方式继续,那将是伟大的!每一毫秒对我来说都是珍贵的,呵呵;) 将所有时间一起排序,用它所属的段和开始/结束位标记每个时间 然后,保留一个列表,说明您所处的段(最初为空) 反复浏览时间列表。如果某个时间属于段X,则如果是开始时间,则将X添加到第二个列表中。如果是结束时间,请从第二个列表中删除X。第二个列表始终告诉您哪些线段重叠 如果有足够多的段关心big-O,则初始排序为O(N logn)。 迭代是O(N) 当然,不要指望大O能让你跑得快。仍然有不变的因素 Python:
from pprint import pprint as pp
intervals = [
(7 , 11, 'A'),
(1, 8, 'B'),
(9, 12, 'C'),
(4, 7, 'D'),
(10, 15, 'E'),
(0, 5, 'F'),
(5, 9, 'H'),
(11, 13, 'I'),
(7, 14, 'J'),
]
intervals.sort() # sort on interval start, then end if starts are equal
ans = []
for n0, (_, end0, name0) in enumerate(intervals[:-1]):
for n1, (start1, _, name1) in enumerate(intervals[n0 + 1:]):
if start1 < end0:
ans.append(sorted((name0, name1)))
else:
break
pp(sorted(ans))
平均而言,“最快”还是“最快”最坏情况更重要?最快最坏情况!周期C和H重叠吗?(终点是否包含?或者第一点是否包含,第二点是否排除?或者它是一个“不在乎-任何最快的”[[a,B],[a,C],[a,E],[a,H],[a,…”这似乎并不意味着这就是目标,但从数学上讲确实如此。开始和结束并不包括在内。在我的情况下,一旦开始/结束重叠,它们就会发生冲突。我喜欢这种方法。我会尝试实现它,然后将结果发布在这里。谢谢!
[['A', 'B'],
['A', 'C'],
['A', 'E'],
['A', 'H'],
['A', 'J'],
['B', 'D'],
['B', 'F'],
['B', 'H'],
['B', 'J'],
['C', 'E'],
['C', 'I'],
['C', 'J'],
['D', 'F'],
['D', 'H'],
['E', 'I'],
['E', 'J'],
['H', 'J'],
['I', 'J']]