Friends Pairing Problem in Java

2025年5月6日 | 阅读4分钟

这是Google、Amazon、TCS、Accenture、Flipkart 等顶级 IT 公司面试中经常遇到的问题。通过解决这个问题,可以考察应聘者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将通过不同的方法和逻辑来解决朋友配对问题。此外,我们还将为此创建 Java 程序。

朋友配对问题动态规划 中一个著名的组合问题的又一个实例。该问题可以描述如下:

问题陈述

如果有 n 个朋友,他们都可以选择保持单身,或者与其他朋友配对。这是一个将 n 个朋友进行分组(配对或单身)的计数问题。

例如,

对于 n=3,可能的配对方式如下:

所有三个朋友都单身:{1,2,3}

朋友 1 与朋友 2 配对,朋友 3 单身:{(1,2),3}

朋友 1 与朋友 3 配对,朋友 2 单身:{(1,3),2}

朋友 2 与朋友 3 配对,朋友 1 单身:{1,(2,3)}

总共有 4 种方式。

当 n 很大时,这个问题本身会呈指数级增长,但有一个 方法 可以使用动态规划高效地解决它。

方法

为了解决这个问题,我们使用以下递推关系:

  • 如果第 n 个朋友保持单身,那么我们得到递推关系 f(n−1),即 (n−1) 个朋友的配对方式。
  • 如果第 n 个朋友与另一个朋友配对,例如,朋友的数量减少到 (n−1),配对的数量减少到 (n−1) × f (n−2)。

因此,递推关系为:

f(n)=f(n−1) +(n−1)×f(n−2)

基本情况

  • f(1)=1:他可能的选择是:保持单身,有一个朋友,不断尝试(后一种在现实中当然不存在)。
  • f(2)=2:要么我们保持单身,要么我们去找一个伴侣。

可以使用递归、动态规划方法或循环来解决。

文件名:FriendsPairing.java

输出

 
Number of ways 5 friends can pair up: 26   

优化

上面的实现使用了大小为 O(n) 的 DP 表。但我们可以使其空间复杂度更优,因为每一步只需要两个先前计算的值。这是优化后的代码:

文件名:FriendsPairing.java

输出

 
Number of ways 5 friends can pair up: 26   

性能分析

时间复杂度

DP 和空间优化版本都运行在 O(n) 时间复杂度,因为我们为每个朋友迭代计算结果。

空间复杂度

DP 版本: O(n)(用于 DP 数组)。

优化版本: O(1)。

应用

朋友配对问题具有广泛的应用:

团队组建:确定团队或小组的可能安排。

图论:在图中查找匹配或配对。

动态规划:理解递归和 DP 技术的基础问题。

结论

朋友配对问题是现实生活中组合问题的一个很好的例子,通过充分理解问题,可以使用动态规划更有效地解决它。

因此,清晰的递推关系和最佳实现让我们能够轻松处理甚至大型输入。无论是在组建团队还是在其他理论图问题中的应用,拥有此算法工具箱对于开发人员应对类似问题都非常有价值。