Algorithm 覆盖所有子阵列的最小集合

Algorithm 覆盖所有子阵列的最小集合,algorithm,data-structures,Algorithm,Data Structures,我在解释这个问题时稍作修改,这样我就很容易解释了 有n名员工,我需要为他们安排一次出游,在这样一个月的某一天,所有(或最多)员工都可以出游 要求每位员工填写一份在线调查,说明其可用性,例如1-31或15-17等,有些员工甚至一天都不可用。 我为所有员工安排的旅行次数没有限制(不考虑谁整个月都不在),但我想找出涵盖所有员工的最短日期。所以在最坏的情况下,我将不得不安排31次旅行 问题:我可以使用什么样的最佳数据结构在此数据结构上运行最佳拟合算法?解决这个问题的最好办法是什么 当然,我指的是节省时间

我在解释这个问题时稍作修改,这样我就很容易解释了

有n名员工,我需要为他们安排一次出游,在这样一个月的某一天,所有(或最多)员工都可以出游

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

问题:我可以使用什么样的最佳数据结构在此数据结构上运行最佳拟合算法?解决这个问题的最好办法是什么

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


我认为的方法是将一个数组维护为31整数,并将其初始化为0。检查每个员工,并根据他们的可用日期增加数组索引。最后对31的数组进行排序。最大值表示max employees可用的日期。并对被排除在外的员工应用同样的逻辑。但问题是要解雇那些被排除在外的员工。为此,我必须对整个员工列表进行一次检查,以了解哪些员工可以被删除,并形成一个新的被忽略员工列表,我可以应用前面的逻辑。按照我的说法,用这种方式两次查看名单来删除员工并不是最好的方法。有什么想法吗?

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

然后你的问题就变成了问题的变体

您的宇宙
U
是所有员工,集合
S
是天。对于每一天
i
,如果该员工在
i
天可用,则员工
j
S[i]
集合中


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

选择1到31之间的数组(每个索引表示一个月的日期)。对于每个日期,您必须创建一个链表(双重)包含该日期可用的emp_id(您可以同时创建此列表,该列表将根据emp_id进行排序,并且您可以保留有关列表大小的信息以及最大员工数的数组索引)。 最大的列表必须在解决方案中(将其作为第一个日期)。 现在将每个列表与最大列表进行比较,并从列表中删除已存在于所选最大列表中的员工。 现在做同样的程序,找到第二个日期,依此类推。。。 整个过程将在O(n^2)中运行(因为31是一个常量值)。
其中一个反例是:10名员工;第一天有1-8名员工,第二天有偶数员工,第三天有奇数员工。第一天最大的列表是1-8名,但最小覆盖范围是{第二天,第三天}。