有没有一个R函数可以得到n个对象中取k个的排列数P(n,k)?

9

...或者我必须提供

P.nk <- factorial(n) / factorial(n-k)

或者

P.nk <- choose(n,k) * factorial(k)

谢谢。

2
正如其他人所说,gregmisc(新解析的gregmisc包中的gtools)中有一个直接排列函数。但是,我发现所有其他包函数都是用于生成排列,而不仅仅是给出排列总数。因此,它们往往速度较慢。我以前对这样的函数进行了基准测试。你在这里提供的选项2远远比我找到的任何包函数都要快得多。它还具有比你的第一个选项更高的计算上限。 - John
感谢提供有用的信息。 - Brani
5个回答

11

我不知道是否存在现成的函数。你的第一个建议在 n 很大的情况下会失败。当写成函数时,你的第二个想法应该可以正常工作:

perm <- function(n,k){choose(n,k) * factorial(k)}

例如,perm(500,2)将会得到249500。


1
第一个建议可以重写为 exp(lfactorial(n) - lfactorial(n-k))。但我也会使用第二个建议。 - Marek

3
我认为 gregmisc 软件包提供了这些功能。
library(gregmisc)
permutations(n=4,r=4)

邮件列表参考:[R]排列组合。 [R] permutation

1
实际上,被要求的将会是:dim(permutations(n,k))[1] - gd047
1
包 'gregmisc' 不可用(适用于R版本3.5.3)Jun 4, 2019 - Nick Dong

2
请查看 'prob' 包中的 nsamp(n,k,ordered=T)

1
在编程中遇到了问题,Rob的回答中提到了“值超出范围”。nsamp(500,2,ordered=TRUE) - Marek
nsamp(173,2,ordered=TRUE) [1] NaN 警告信息: 1: In factorial(n[i]) : value out of range in 'gammafn' 2: In factorial(n[i] - k[i]) : value out of range in 'gammafn' nsamp(171,2,ordered=TRUE) [1] Inf 警告信息: In factorial(n[i]) : value out of range in 'gammafn' nsamp(170,2,ordered=TRUE) [1] 28730
----R版本3.5.3
- Nick Dong

1

另一种使用基本R的方法是:

permn <- prod( (n-(0:(k-1)))

这是以下公式的简单实现:

$$p(n,k) = \prod_{j=0}^{k-1} n-j$$


0

这些选项实际上是用于生成排列的,如果你只需要排列的数量,那么速度会非常慢。 - Stefan Avey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接