0

我需要计算 R 中从 1 到 15 的 15 个数字的排列。

library(combinat)
#With 1 to 3
permn(3)
#With 1 to 10
options(max.print=factorial(10))
permn(10)

考虑到 permn(10) 上面的代码的排列量,只需要 5 分钟,就可以满足我的需要(但我对速度并不感兴趣)。

但是,我需要使用 15 个数字(1 到 15)来执行此操作。不幸的是,当我尝试时 R 返回错误:

permn(15)
  Error in vector("list", gamma(n + 1)) : 
  vector size specified is too large

编辑 这可以分阶段完成吗? 我正在使用它来重新排序数据集,然后进行一些计算,所以我可以分阶段进行,例如执行前 300,000 个排列,应用计算,然后执行接下来的 300,000 个排列等。换句话说,计算 x 个排列然后在循环中根据第一个排列重新排序数据集列,进行一些计算,然后对第二个排列执行相同的操作等。

你知道解决这个问题的任何方法吗?是否值得使用一些 C 代码来代替?我找到了几个例子(例如12),但我不知道 C 是如何工作的。我无法让它与 R 一起使用(可能是因为我不明白 C 代码在做什么)。

我已经安装了 Rccp、Rtools 并尝试了简单的 cppFunction 示例,它们工作正常,但是我没有得到任何字符串排列的结果(当我尝试在上面的链接中包含代码时,我得到了 sourceCpp 中的错误错误(代码= code, env = env, rebuild = rebuild, showOutput = showOutput, :). 正是因为我不懂 C 代码,所以向您展示我运行的代码可能毫无意义(很可能是错误的)。

有人会告诉我如何从 R 中运行上述(或者如果可能的话更好)C 代码,或者你有什么办法在 R 中解决它吗?

非常感谢

注意:我重新发布了这个,因为我更改了排列的数量并从字符串移动到数字。我还添加了一些关于我需要做什么的细节。

4

1 回答 1

3

真正的问题是15!=1,307,674,368,000。这只是太多列表需要迭代,更不用说存储在内存中了。

如果我们为了论证而假设 的每次迭代permn(15)将花费与 的一次迭代相同的时间permn(10),而后者总共需要 5 分钟,那么您将看到 3.4 年的计算时间。

这称为组合爆炸

于 2013-03-20T17:13:54.007 回答