2016-03-13 49 views
1

是的,我有RTFM。或者,在这种情况下,RTFSO。如果它显示在“npr”或“permutation”的搜索结果中,我就读过它。虽然我实现了Heap的算法,但我无法从那里(所有排列)跳跃到nPr(长度为r的所有排列,从较大的集合n中排除)。求解nPr(排列)的算法。 For dummies

实际算法(伪代码很好)比不包含实际代码的冗长解释更受欢迎。如果你想按照理论学习我,那很好,我会很乐意从中学习,但我还想要随附的代码。如果你可以用堆的话来说,太棒了;否则,我会混淆。

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

在缺少我的NPR的描述时,这里是什么,我希望做一个很简单的例子:

给定了......

A,B,C

...我想找到的每两个字符排列,就像这样:

AB
AC
BC

这个例子太简单了,因为我真正试图推导出的是一个广义的解决方案,它将一个集合(数组)和每个排列中应该有的项目数作为调用参数。

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

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

+0

我真的不知道自己想要什么。你没有指定一种语言;而你其实并没有问过一个问题。然而,这可能有所帮助:http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n – abelenky

+0

好吧,我的意思是说,伪代码是罚款,并要求提供一个解决nPr的算法,所以我很抱歉不清楚。如果你真的需要用特定的语言编写它,我最熟悉:C,C++,Pascal,VB,JavaScript和VBScript。 – Brian

+0

什么是RTFM和RTFSO?这是绝对不清楚你究竟想要什么 –

回答

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