这是我最近遇到的一个采访问题。 您在派对中有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中表现不佳)
这是仅使用图表解决还是有更好,更快的方法? 有贪心方法吗?
答案 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]。
如果我们首先尝试将区域划分为甚至电源的两个非连接区域的连接,我们也可以提高速度。