Algorithm 最大化成对数的有效方法

Algorithm 最大化成对数的有效方法,algorithm,dynamic-programming,graph-theory,graph-algorithm,greedy,Algorithm,Dynamic Programming,Graph Theory,Graph Algorithm,Greedy,这是我最近遇到的一个面试问题。 聚会中有G位客人(编号从1到G)。每位客人都有一个长度为G的偏好列表,表示他与他人交谈的偏好。 例如,如果guest 1的首选项列表为N Y(假设有5位客人),则guest 1有兴趣与2位或5位交谈,而不是与其他人交谈 假定 a) 每位客人只能与另一位客人交谈 b) 如果a对b感兴趣,那么b也对a感兴趣 给定客人及其偏好矩阵,给出可保持参与的最大配对数 Let G = 5; 偏好矩阵是 N Y N N N Y N Y Y Y N Y N N N N Y N N

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

假定

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

给定客人及其偏好矩阵,给出可保持参与的最大配对数

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
我们可以观察到,每个人都有兴趣与客人2交谈,但他只能与另一个人交谈,因此答案是1对

我的做法:

我认为这是图论中的最大匹配问题,但无法实现 在短时间内。(我不擅长图形算法实现)

这是仅使用图形解决的还是有更好、更快的方法?

有贪婪的方法吗?

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

简化:
删除没有朋友的客人。
将图形划分为非连通区域

此外,对于每个区域,将完成下一阶段:

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


如果我们首先尝试将该区域划分为两个功率相等的非连接区域的连接,我们还可以提高速度。

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

对于问题(N,R),我们将来宾编号为1,2,…,N,然后扫描关系列表以获得一个不重复的列表(哈希表可能有助于检查重复项)

1&2、1&4、2&3等

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

A) 如果取1和2,则移除所有1或2的对,并对其余的进行递归

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

B) 如果跳过1和2,则对其余部分执行递归

RB将是没有链接的剩余关系列表(1和2)。我们有(N,RB)的递归-仍然是N,因为1或2可能仍然保留在完整的集合中

C) 检查渲染更多对的路径

我们需要记忆来存储(K,R)的结果,因为可能会有像(1,3,5,…)和(2,4,6,…)这样的来宾集群,其中来宾在集群内是彼此的朋友


如果我们使用朴素递归,我们将多次解决相同的问题。但这些簇意味着它们的解是对称的。因此,我们需要通过组合来宾的数量及其关系来识别图(对来宾重新编号会生成相同的图)。

没有比Edmonds的blossom算法更简单的组合方法了。(至少,没有人知道。)不过有一个问题。你能检查一下我的答案吗?在来宾集群的情况下,排序可能没有多大帮助,尽管在递归的每个步骤中删除没有朋友的来宾是一种优化。在递归的每个步骤中删除没有剩余朋友的来宾是一种优化。+1,这是关于集群的一个好想法,但您还没有将其引入到算法中。我试图进一步改进它。@Gangnus(K,R)的函数应该考虑相同的集群。我仍然在想,有什么方法可以快速识别两个图形是相同的。这应该是一个标准的CS主题,但是你自己考虑它是很有趣的。当然,一个额外的图形比较实用程序将是有用的,因为它不需要重复类似的子图。特别是对于较小的图,这将是非常有用的。@Gangnus-图比较原来是一个相当大的主题:)(图匹配的三十年!而O(n)仅在2001年才被提出)