需要从这些集合列表中选择整数集的算法

时间:2013-09-07 17:00:14

标签: algorithm

我有一个列表,其成员是从中选择的5个数字的集合 整数1到600 [或0到599用于存储目的]。 我需要选择此列表的子列表,以便在此列表中 子列表,1到600范围内的每个整数恰好出现一次,所以a 120个元素的子列表。我的列表中包含4200或840个元素 它 - 我会通过运行找出是否需要更大的数字。 我需要任何一个这样的子列表。

这听起来像是一个标准问题,但我不知道如何 搜索。有人可以帮忙提供算法吗?

1 个答案:

答案 0 :(得分:1)

来自Set Cover Problem

  

集合覆盖的贪婪算法根据一个规则选择集合:在每个阶段,选择包含最大数量的未覆盖元素的集合

维基百科似乎说这个算法在合理的复杂性假设下运作得最好。

我会把它归结为这些步骤:

  1. 从列表中选择一个元素(可能是第一个)
  2. 选择您遇到的下一个元素,其中所有5个数字尚未在子列表中显示
  3. 如果到达目的地,请返回列表的开头并将步骤#2的条件降低为4个数字
  4. 重复步骤2& 3,直到你覆盖所有整数
  5. 根据您使用的编程语言,有很多方法可以快速完成。

    编辑:海报解释说每个整数必须完全一次

    因此,您真正需要做的就是继续添加元素,直到元素包含已存在于您的子集中的整数。 “准确”标准优先于“尚未在子集中”标准。当你达到120个子集时,你就会突破循环。

    您可能还想跟踪向子集添加元素的顺序,以及何时达到死胡同(例如,超集中剩余的每个元素都包含已存在于子集中的整数你回溯一个元素并继续。

    为了回溯并记住哪些组合不起作用,您需要保留一个“禁止的集合”列表,每次您决定是否添加新元素时,首先要确保它不在此列表中禁止收藏。在Ruby中执行此操作的最佳方式(存在)是存储集合的哈希而不是集合本身。这提供了一种廉价的方法来评估预期的收集是否已经被尝试并导致死胡同。

    祝你好运!