采访调度算法

时间:2015-03-30 05:05:03

标签: algorithm dynamic-programming greedy divide-and-conquer

我正在考虑一种算法,该算法始终在最佳时间内为此问题提供最佳解决方案:

n个求职者,k个房间,他们在一天中的不同时间安排了面试。面试在每个房间都有一个特定的时间表,每个面试都有一个指定的开始时间(s i ),结束时间(f i )和面试室(r I )。所有时间单位总是整数。此外,我们需要与当天正在接受采访的人一起安排图片。图片不能有效地占用任何时间,但在当天的某个时刻,每个受访者都必须在图片中。如果我们在t时间安排一张图片,那么目前正在接受采访的所有人都将在该图片中。拍照不会影响每次采访的开始和结束时间。问题是这样的:有一个无序的访谈列表,每个都有变量(s i ,f i ,r i ),怎么做你确保每个面试候选人都在拍照,同时拍摄尽可能少的照片?

理想情况下,当有尽可能多的人在场时,我们会拍照,以尽量减少拍摄的照片数量。我最初的想法是一种蛮力,但这将是一个非常糟糕的大O运行时。在尽可能少地返回可能的照片的同时最小化该算法的运行时间是非常重要的。话虽这么说,如果你能想到一个不能完美解决问题的快速贪婪算法,我也想听听。

我确信我的描述远非完美无缺,所以如果您希望我澄清任何内容,请随时发表评论,我会回复您。

1 个答案:

答案 0 :(得分:0)

从以下观察开始:

  1. 每次面试时必须至少拍摄一张照片,因为我们无法在他们到达之前或离开之后拍摄该受访者。
  2. 仅可在s i 和f i 的时间拍摄更改的人物。
  3. 在到达事件s i 之后,如果下一个事件j是到达,则无需在s i 和s之间拍照 j ,因为s i 的所有人都可以在s j 获得。
  4. 因此,您可以通过到达事件(最多k)让这些可用的受访者“积累”并等待拍照,直到某人即将离开。
  5. 因此我认为以下算法应该有效:

    1. 将到达和离开时间放入列表并对其进行排序(时间应保留标记为“到达”或“离开”以及受访者的索引)。
    2. 创建一个大小为A的布尔数组n,以跟踪每位受访者是否可用(面试正在进行中)。
    3. 创建一个大小为P的布尔数组n,以跟踪每个受访者是否已被拍照。
    4. 遍历已排序的时间列表(索引变量i):

      一个。如果遇到到达,请将A[i]设置为true

      湾如果遇到离职j,请检查P[j]以查看是否已经离开此人。如果没有,请立即拍照并记录其效果(适用于所有A[k] = true设置P[k] = true)。最后将A[i]设置为false

    5. 排序为O(n log n),循环有2 n次迭代,检查数组是O(1)。但是,因为在每个拍照事件中,您可能需要循环A,在最坏的情况下整体运行时间为O(n 2 )(如果没有采访重叠的时间)。