【问题标题】:Minimum sets to cover all sub arrays覆盖所有子数组的最小集合
【发布时间】:2016-01-23 13:01:44
【问题描述】:

我在解释这个问题时稍作修改,以便于解释。

n 名员工,我需要在一个月中的某一天为他们安排一次郊游,以便所有(或最多)员工都可以参加郊游。

要求每位员工填写一份在线调查,说明他的可用性,例如1-31 或 15-17 等等等等。有些甚至可能一天都没有。 我必须安排覆盖所有员工的旅行次数没有限制(不考虑谁整个月都不可用),但我想找出最少的日期集以覆盖所有员工。所以在最坏的情况下,我将不得不安排 31 次旅行。

问题:我可以使用哪种数据结构在此数据结构上运行最佳拟合算法?解决此问题的最佳方法是什么?

当然,我指的是节省时间和空间的方法,但我也在寻找其他解决方案。

我认为的方法是维护一个包含 31 个整数的数组并将其初始化为 0。遍历每个员工并根据他们的可用日期增加数组索引。最后对 31 的数组进行排序。最大值表示 qhich max 员工可用的日期。并对被排除在外的员工应用相同的逻辑。但问题是要移除被排除在外的员工。为此,我将不得不遍历整个员工列表一次,以了解哪些员工可以被删除,并形成一个新的被遗漏员工列表,我可以在其上应用之前的逻辑。在我看来,以这种方式遍历列表两次以删除员工并不是最好的。有什么想法吗?

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    作为第一步,您应该排除没有可用日期的员工。

    那么你的问题就变成了Set Cover Problem的变体。

    您的宇宙U 是所有员工,集合S 是天。对于i 的每一天,您有员工j 在集合S[i] 中,前提是该员工在i 当天有空。

    这个问题是 NP 难的。因此,除非您想要一个近似的解决方案,否则您必须检查每个 31^2 天的组合,可能需要进行一些修剪。

    【讨论】:

      【解决方案2】:

      选择一个从 1 到 31 的数组(每个索引代表一个月的日期)。对于每个日期,您必须创建一个链表(双重)包含当天可用的 emp_id(您可以同时创建此列表将根据 emp_id 进行排序,您可以保留有关列表大小和最大员工数的数组索引的信息)。 最大的列表必须在解决方案中(将其作为第一个日期)。 现在将每个列表与最大列表进行比较,并从列表中删除那些已经存在于所选最大列表中的员工。 现在做同样的程序并找到第二个日期等等...... 整个过程将在 O(n^2) 中运行(因为 31 是一个常数值)。 空间将是 O(n)。

      【讨论】:

      • 反例之一是:10 名员工;第一天有 1-8 名员工,第二天 - 偶数员工,第三天 - 奇数员工。最大的列表是第一天的 1-8 个,但最小的覆盖范围是 {second day,third day}。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 2014-12-15
      • 2013-01-05
      相关资源
      最近更新 更多