我希望为大数生成有序排列,即 37P10(大小为 10 的 37 的排列)。我正在为此目的使用combinat
包,permn()
函数,但它不适用于超过 10 个数字。同样通过这个,我无法生成如上面示例中描述的不同大小的排列。
此外,我正在使用do.call(rbind,)
函数将这些排列组合成一个矩阵。请问有任何其他 R 语言中的包可以用于此目的吗?
我希望为大数生成有序排列,即 37P10(大小为 10 的 37 的排列)。我正在为此目的使用combinat
包,permn()
函数,但它不适用于超过 10 个数字。同样通过这个,我无法生成如上面示例中描述的不同大小的排列。
此外,我正在使用do.call(rbind,)
函数将这些排列组合成一个矩阵。请问有任何其他 R 语言中的包可以用于此目的吗?
你所要求的根本无法完成。您要求生成和存储 10 个数字的 1.22e15(或 4.81e15 替换)排列。即使每个数字只有一个字节,您也需要1000 万 GB的 RAM。
在我的LSPM包中,我使用该函数LSPM:::.nPri
根据其词法排序索引生成特定排列。您无法在合理的时间内迭代每个排列,因此我建议您对所有可能的排列进行抽样。
请注意,由于如此大的数字的精度问题,上述代码不适用于 nPr(37,10),但它应该作为一个很好的起点。
在普通计算机上生成这么多排列几乎是不可能的。
快速计算显示(37 P 10)
是1264020397516800
。要存储这么多整数本身,您需要1264020397516800 x 64
位。即8.09×10^7 Gb (gigabits)
或10^7 Gigabytes
。然后要存储实际的排列信息,您将需要更多的“内存”在 RAM 或硬盘中。
我认为最好的策略是编写置换函数,按顺序创建有序置换,并迭代地进行分析而不生成所有可能的置换。