算法 – O(n)时间中的FInd重叠约会?

最近我在接受采访时问这个问题。即使我能够提出O(n ^ 2)解决方案,面试官也痴迷于O(n)解决方案。我还检查了我理解的O(nlog n)的其他几个解决方案,但是O(n)解决方案仍然不是我的一杯茶,它假定按照开始时间排序的约会。

有人可以解释一下吗

问题陈述:

你被给予’n’约会。每个约会包含开始时间和结束时间。您必须有效地重新调用所有冲突的约会。

Person: 1,2,3,4,5
App St: 2,4,29,10,22
App End: 5,7,34,11,36

Answer: 2×1 5×3

O(nlog n)算法:单独的开始和结束点,如下所示:

2s,4s,29s,10s,22s,5e,7e,34e,11e,36e

然后排序所有这些点(为了简单起见,假设每个点都是唯一的):

2s,4s,5e,7e,10s,11e,22s,29s,34e,36e

我们连续的开始没有结束,那么它是重叠的:
2s,4s是相邻的,所以重叠在那里

我们会保持一个“s”的计数,每次遇到它将1,当遇到e时,我们将计数减1。

在O(n)中,这个问题的一般解决方案是不可能的。

至少你需要按预约开始时间排序,这需要O(n log n)。

如果列表已经被排序,则有一个O(n)解决方案。该算法基本上包括检查下一个约会是否与以前的任务重叠。这个有点微妙,因为你通过它实际上需要两个指针到列表中:

>正在检查的当前约会
>到目前为止遇到的最终结束时间的预约(可能不是以前的预约)

对于未排序的情况,O(n)解决方案只能存在,如果您有其他约束,例如固定数量的约会时间。如果是这样,那么您可以使用HashSets来确定哪个约会覆盖每个时隙,算法大致如下:

>为每个时隙创建HashSet – O(1),因为时隙号是固定的常数
>对于每个约会,将其ID号存储在其所覆盖的插槽的散列表中 – O(n),因为每个约会更新常数数量的时隙为O(1)
>通过插槽运行,检查重叠 – O(1)(或O(n)如果要迭代重叠约会以将其作为结果返回)

http://stackoverflow.com/questions/12283559/find-overlapping-appointments-in-on-time

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – O(n)时间中的FInd重叠约会?