Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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_Set_Graph Algorithm - Fatal编程技术网

Algorithm 从多个集合中的每个集合中找到至少包含一个元素的最小集合的算法是什么

Algorithm 从多个集合中的每个集合中找到至少包含一个元素的最小集合的算法是什么,algorithm,set,graph-algorithm,Algorithm,Set,Graph Algorithm,所以,我有几个集合,我需要从所有集合中找到包含至少一个元素的集合的最小数目。为了使这更具体,我有一组服务器名称,每个服务器都有一个服务窗口。给定特定的持续时间,我希望找到覆盖所有给定服务器的最小服务窗口集 我已经有了代码,可以为每台所需的机器生成所有不重叠的N分钟时间段的列表。我本打算通过生成所有可能的组合,并选择唯一元素数量最少的组合来强制执行它,但这似乎效率极低,即使我首先将集合减少为所有主机的唯一窗口(特别是对于多个系统) 然后我想我会做一些事情,比如按照每个时隙中的主机数量对时隙进行排序

所以,我有几个集合,我需要从所有集合中找到包含至少一个元素的集合的最小数目。为了使这更具体,我有一组服务器名称,每个服务器都有一个服务窗口。给定特定的持续时间,我希望找到覆盖所有给定服务器的最小服务窗口集

我已经有了代码,可以为每台所需的机器生成所有不重叠的N分钟时间段的列表。我本打算通过生成所有可能的组合,并选择唯一元素数量最少的组合来强制执行它,但这似乎效率极低,即使我首先将集合减少为所有主机的唯一窗口(特别是对于多个系统)

然后我想我会做一些事情,比如按照每个时隙中的主机数量对时隙进行排序,选择主机数量最多的时隙,然后为未分配的主机重新生成所有时隙的列表,选择最受欢迎的时隙,重新计算,等等,直到所有主机都被计算在内。虽然这会给我一个答案,但这并没有让我真正有机会选择最平衡的服务窗口集——第二个目标是找到一组在每个服务窗口的主机数量上具有最小标准偏差的服务窗口。因此,如果我有100台主机,我会优先选择每个窗口大约有50台主机的窗口,而不是执行上述算法可能找到的三个“98、1和1”窗口。但如果我的选项是“98、1、1”或10个窗口,每个窗口10个。我宁愿做三个


无论如何,似乎可以用某种图形来表示这个问题,但在我的CS路径中,我更多地关注硬件而不是软件,解决图形问题从来都不是我的专长。因此,我甚至希望您能给我一些建议,告诉我在哪里可以阅读更多关于这个特定问题的信息,或者适当的搜索词

考虑与每个时间段关联的单个服务器集。您希望构造这些集合的子集,使其联合包含所有服务器。这被称为,它被证明是NP完全的。这意味着您无法比问题中描述的暴力方法做得更好,因此请尽可能减少来自所有主机的唯一窗口的数量。

另外,我不确定为什么要删除他的答案-我认为这是正确的。

这是集合覆盖优化问题,这是NP难问题。这意味着在最坏的情况下,你不能比暴力做得更好。也就是说,有一些集合的安排,你可以很快找到一个覆盖。但是你绝对可以简化这个问题,特别是在真实世界的数据中

首先,我要对数据进行几次转换。把你的集合想象成一个布尔网格。每列代表一个服务器,每行代表一个集合。单元格中的True表示该集合中存在服务器

  • 很可能有多台服务器属于完全相同的集合。也就是说,该矩阵中可能有相同的列。您可以删除任何重复的列。因此,如果A和B具有完全相同的“保存服务”窗口,则获取包含A的覆盖也将包含B。您可以通过按此列中的值对每个服务器进行散列,然后检查同一散列桶中的每个服务器是否具有相同的集合成员资格来快速完成此操作。只保留一台服务器,并创建一个“随行”服务器列表。从现在起,这些服务器将被视为集合中的单个成员

  • 删除作为单个其他集合子集的任何集合。e、 如果你有{1,2,3}和{1,2}。从问题中删除{1,2}。在为覆盖选择集合时,{1,2,3}始终是更好的选择。因此,转储子集-例如,删除所有此类行

  • 迭代每个服务器(例如,每个列)。仅存在于一个集合中的每个服务器(例如,列中有一个true),则该集合必须是解决方案的一部分。因此,将该集合添加到解决方案中,并将其从矩阵中移除。现在,您可以从矩阵中删除已删除集合中的任何列。假设服务器A只存在于集合1中,即{A,B,C}。井组1必须是解决方案的一部分。如果是的话,那么我自动知道服务器A、B、C将自动被覆盖。所以我从矩阵和A,B,C列中删除了集合1

  • 删除每个集合中的所有服务器。他们将在任何解决方案

  • 在此之后,你真正的问题集应该大大减少,除非你的数据集是“反常的”。现实世界中的数据可能足够有序,以至于一堆行和列都不会出现问题

    我相信有一些很好的方法可以搜索到一个答案,在实践中,这个答案会让你在一个比蛮力更好的时间内,为真实世界的数据提供非常接近最优的覆盖


    <>我考虑DP或A星搜索解决方案。我没时间了。我可能以后再画一个草图。

    好吧,知道有一个很好的理由我不能很快想出一个更有效的解决方案,这确实让我感觉好一点。但这只意味着,每当主机组发生变化时,计算机上就会出现一堆难看的代码和严重的攻击。谢谢你给它起了个名字。:)