最大化对数的有效方法

时间:2014-11-06 11:18:24

标签: algorithm dynamic-programming graph-theory graph-algorithm greedy

这是我最近遇到的一个采访问题。 您在派对中有G位客人(编号从1到G)。每位客人都有一个长度为G的首选项列表,表示他与他人交谈的偏好。 例如,如果客人1的首选项列表是N Y N N Y(假设有5位客人),则客人1有兴趣与2或5但不与其他人交谈。

假设

a)每位客人只能与另一位客人交谈 b)如果a有兴趣与b交谈,那么b也有兴趣与

交谈

给定一组客人及其偏好,给出最大数量的可以保持参与的对。

Let G = 5;

首选项矩阵

N Y N N N
Y N Y Y Y
N Y N N N
N Y N N N
N Y N N N

我们可以观察到每个人都有兴趣与Guest 2交谈,但他只能与另一个人交谈,所以答案是1对。

我的方法:

我认为它是图论中的最大匹配问题,但无法实现它 在很短的时间内。(我在Graph Algo Implementation中表现不佳)

这是仅使用图表解决还是有更好,更快的方法? 有贪心方法吗?

2 个答案:

答案 0 :(得分:1)

我们可以使用递归和一些memoization。请找到一种方法来识别具有K个节点和所有关系的图形(我们将在下面看到为什么我们需要这个)。在递归期间,我们应该记录已经解决的案例(K,R),其中K是客人的数量,R是这些K客人的关系列表。

对于问题(N,R),我们将客人编号为1,2,...,N,然后扫描关系列表以获得没有重复的列表(哈希表可以帮助检查重复项)< / p>

1&amp; 2,1&amp; 4,2&amp; 3,等等。

我们需要找到最大的非碰撞对(例如,1&amp; 2与2&amp; 3碰撞)。我们可以使用以下递归算法:

A)如果1&amp;取2,然后用1或2删除所有对,并对其余部分进行递归。

R A 将是没有1和2的剩余关系列表。我们有((N-2),R A

的递归

B)如果1&amp;跳过2,与其余的一起递归。

R B 将是没有链接(1&amp; 2)的剩余关系列表。并且我们有(N,R B )的递归 - 仍然是N,因为1或2可能仍然保留在整个集合中。

C)检查哪条路线呈现更多的对。

我们需要通过记忆来存储(K,R)的结果,因为可能有客人群集,如(1,3,5,...)和(2,4,6,...)客人是朋友彼此就在集群内部。

如果我们使用天真的递归,我们会多次解决相同的问题。但这些集群意味着他们的解决方案是对称的。因此,我们需要通过客人数量及其关系的组合来识别图表(重新编号的客人生成相同的图表)。

答案 1 :(得分:0)

递归将分为两个主要阶段:

<强>简化:
没有朋友的客人 将图表划分为非连接区域。

此外,对于每个区域,下一阶段都将实现:

<强>切割
根据朋友的数量订购客人 将第一个未尝试的连接带入找到的对列表中 从简化开始重复整个过程,收到的缩小区域直到所有连接都被递归尝试,或者当前构建集中的对数等于[Area power / 2]。

如果我们首先尝试将区域划分为甚至电源的两个非连接区域的连接,我们也可以提高速度。