algorithm - 最大化对数的有效方法

标签 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 也有兴趣与 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 交谈,但他只能与另一个人交谈,所以答案是一对。

我的方法:

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

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

最佳答案

我们可以使用递归和一些内存。请找到一种方法来识别具有 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, ...) 这样的客人集群,其中客人是 friend 彼此就在簇内。

如果我们使用朴素递归,我们将多次解决相同的问题。但是集群意味着它们的解决方案是对称的。因此,我们需要结合客人数量及其关系来识别图表(重新编号客人会产生相同的图表)。

关于algorithm - 最大化对数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778152/

相关文章:

graph - 如何选择包含任意 k 个节点的图的最小子图

c++ - O(N^2)最短路径算法

algorithm - 这是什么类似的背包?组建最佳团队

windows - 负载均衡器背后的算法?

algorithm - 在集合的分区上最大化 AND 和 XOR 的 bool 函数

java - 如何动态地在整数数组中添加元素?

python - 使用 NetworkX 的社区检测算法

algorithm - Dijkstra 算法中边缘的松弛

algorithm - 是否存在从表达式中提取子表达式的算法?

c++ - 将一个输入文件与给定数量的文件匹配的算法