python - 图遍历,也许是另一种数学?

标签 python algorithm set graph-algorithm graph-traversal

假设您有一个数字集/列表/集合:[1,3,7,13,21,19](顺序无关紧要)。假设出于不重要的原因,您通过一个函数运行它们并收到以下对: (1, 13), (1, 19), (1, 21), (3,19), (7, 3), (7,13), (7,19), (21, 13), (21 ,19).同样,顺序无关紧要。我的问题涉及下一部分:如何找出可以成为一对而不重复的数字的最小数量?对于这个特定的序列,它是全部六个。对于 [1,4,2],对是 (1,4)、(1,2)、(2,4)。在这种情况下,可以排除任何一个数字,因为它们都是成对的,但它们每个都重复,因此它将是 2(哪个 2 无关紧要)。 乍一看,这似乎是一个图遍历问题——数字是节点,对边。是否有数学的某些部分处理这个问题?我写遍历算法没问题,我只是想知道是否有时间复杂度较低的解决方案。谢谢!

最佳答案

如果您真的想要找到最小数量,答案是 0,因为您根本不必使用任何数字。

我猜你是想写“最大数量的数字”。

如果我对您的问题的理解正确,听起来我们可以将其转化为以下问题: 给定一组 n 个数字 (1,..,n),我可以使用多少个数字来将这组数字分成对,其中每个数字只能出现一次。

这个问题的答案是:

  • 当 n = 2k f(n) = 2k 对于 k>=0
  • 当 n = 2k+1 f(n) = 2k 对于 k>=0

我将使用归纳法进行解释。

  1. 如果 n = 0 那么我们最多可以使用 0 个数字来创建对。
  2. 如果 n = 2(集合可以是 [1,2])那么我们可以使用这两个数字来 创建一对 (1,2)
  3. 假设:如果 n=2k 让我们假设我们可以使用所有 2k 个数字来创建 2k 对并使用归纳法证明我们可以使用 2k+2 个数字来满足 n = 2k+2。
  4. 证明:如果 n = 2k+2, [1,2,..,k,..,2k,2k+1,2k+2],我们可以使用 2k 个数字(根据我们的假设)创建 k 对。不失一般性,假设输出对是 (1,2),(3,4),..,(2k-1,2k)。我们可以看到我们还有两个数字 [2k+1, 2k+2] 我们没有使用,因此我们可以从其中两个中创建一对,这意味着我们使用了 2k+2 个数字。<

当n为奇数时,你可以自行证明。

关于python - 图遍历,也许是另一种数学?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52231442/

相关文章:

algorithm - 任何涉及图论的解决指南?

algorithm - 如何计算 32 位整数中设置的位数?

python - 如何快速比较列表和集合?

python - 使用集合创建列会复制集合 n 次

python - 如何自定义数据帧索引,同时保持它们自动递增?

python - 添加到 numpy 字符串数组

python - 编写函数以根据变量输入过滤和重命名多个数据帧列

python - __get__ 一个简单函数的目的

python - 比较列表中整数与给定值的差异

string - 提取字符串表达式表示的所有可能的字符串集(汤普森构造的一部分)