Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检测重叠时段(或时间范围)的最快方法_Algorithm_Sorting - Fatal编程技术网

Algorithm 检测重叠时段(或时间范围)的最快方法

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

假设我有很多时间段是通过开始和结束时间戳标识的。检测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 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']]