【问题标题】:Algorithm to solve nPr (permutations). For dummies求解 nPr(排列)的算法。对于假人
【发布时间】:2016-06-28 04:34:23
【问题描述】:

是的,我有 RTFM。或者,在这种情况下,RTFSO。如果它出现在“npr”或“permutation”的搜索结果中,我会阅读它。虽然我已经实现了 Heap 的算法,但我无法从那里(所有排列)跳跃到 nPr(长度为 r 的所有排列,从更大的集合 n 中)。

实际算法(伪代码很好)优于不包含实际代码的冗长解释。如果你想教我理论,很好,我很乐意从中学习,但我也想要随附的代码。如果你可以用堆的术语来表达,那就太好了;否则,我就蒙混过关了。

我没有任何代码可以给你看(除非你想看到堆在 VBScript 中的实现(这是我在工作中必须使用的全部内容))因为正如我所说,我不知道去哪里从那里得到集合 n 的每个 r 长度子集。

如果缺少我对 nPr 的描述,这里有一个非常简单的示例来说明我想要做什么:

给定集合...

A、B、C

...我想找到每个两个字符的排列,如下所示:

A B
一个C
B C

这个例子过于简单化了,因为我真正想要推导出的是一个通用的解决方案,它采用一个集合(数组)和每个排列中应该包含的项目数作为调用参数。

嗯...现在我已经写了所有这些,在我看来,我只需要知道如何从集合 n 中导出所有长度为 r 的子集,因为我可以找到这些子集的排列使用堆的。

仅供参考:今年我将 50 岁;这不是家庭作业。

【问题讨论】:

  • 我真的不知道你想要什么。您没有指定语言;而你实际上并没有问过问题。但是,这可能会有所帮助:stackoverflow.com/questions/127704/…
  • 好吧,我的意思是说伪代码很好,并要求一种算法来解决 nPr,所以我为不够清楚而道歉。如果你真的需要用特定的语言编写它,我最熟悉的:C、C++、Pascal、VB、JavaScript 和 VBScript。
  • 什么是 RTFM 和 RTFSO?完全不清楚你真正想要什么
  • 我是不是被骗了?还是这是语言障碍?在 as-plain-as-I-can-make-it 英语中:我要求一种算法,用于从长度为 n 的集合中生成长度为 r 的所有排列。
  • 寻找Combinations例子stackoverflow.com/questions/127704/…

标签: algorithm recursion permutation


【解决方案1】:

使用递归相对简单:

  • 对于集合中的每个元素,使用与否。
  • 对这两个变体使用集合的其余部分进行递归。
  • 当结果完成或剩余集合为空时停止。
  • 为了性能,避免使用开始/位置索引进行实际设置操作。

在 JavaScript 中:

function nPr(set, n) {
  nPrImpl(set, 0, new Array(n), 0);
}

function nPrImpl(set, pos, result, resultPos) {

  // result complete
  if (resultPos == result.length) {
    window.console.log(result);
    return;
  } 

  // No more characters available
  if (pos >= set.length) {
    return;
  }

  // With set[pos]
  result[resultPos] = set[pos];
  nPrImpl(set, pos + 1, result, resultPos + 1);

  // Without
  nPrImpl(set, pos + 1, result, resultPos);
}

// Test:
nPr(['A', 'B', 'C'], 2);

输出:

["A", "B"]
["A", "C"]
["B", "C"]

演示:https://tidejnet.appspot.com/v3/#id=8ht8adf3rlyi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多