假设我有一个 n 个集合的列表,有没有一种有效的方法来计算相交大于任何其他个组合的 r 个集合的组合r 是否在列表中设置?
特别是,我有一个大约6000套字符串的列表,我想从该列表中选择大约9套字符串,以便它们在9套字符串的所有组合中共享最多的字符串。问题是,如果我要对其进行强力计算并计算所有组合并查找最大交集,则将需要花费(6000选择9)〜3e28个计算,因此我需要一个更高效的算法或一些可靠的启发式方法。 / p>
此外,如果可能的话,我想将这个问题扩展到选择一个变量 r ,以使任何组合的总元素大小小于某个任意阈值,而不是选择一个常量 r 。也就是说,该算法不仅会从6000个列表中选择9组进行组合,还会添加字符串集,直到组合中的字符串总数超过某个阈值(例如40个字符串)为止。
这与我最初想要做的事情非常接近,但是我意识到采用9套固定大小的组合对于我正在使用的列表来说效果不错,并且可能更容易实现,尽管算法可以做到这一点将是可取的。据我所知,这个问题类似于背包问题,尽管我知道解决该问题的唯一有效方法是动态编程,而且我不确定在这种情况下如何实现动态编程,因为我必须计算运行的交叉路口以获取权重,而不是像常规背包那样预先计算权重列表。
答案 0 :(得分:1)
这是给您的一个主意:
从6000个中随机选择9个集合。对于其余5991个集合,确定要替换9个集合中的哪一个以最大程度地增加交集(如果没有改善,请不要使用新集合)。这大约是6000 * 9次操作。
重复K
次,并跟踪答案。然后找到大多数答案中出现的组合(获胜组合)。重复整个过程,但是现在随机选择的起始集合必须包括获胜集合,并且获胜集合不能替换。
重复直到9套中的8套成为赢家。那么第9集就是使交集最大化的任何集。如果所有答案都相同,您也可以提前终止。
运行时间大约是6000 * 9 * K * 8
个操作,其中一个操作将计算9个集合的交集。