首页 > 解决方案 > 在 R 中不重复和零结构的“k”单元之间分配“n”

问题描述

我想知道 R 中是否有一种方法可以在不重复的单元n之间进行分配(例如,与, 和and相同)并且不考虑组合(即 no )并查看此分布的构成?k3 5 25 3 22 3 55 2 309 1 0

例如,如果n = 9然后k = 3我们期望化妆是:

(注意:k将始终是列数)

3 3 3 4 3 2 4 1 4 5 2 2 5 1 3 6 2 1 7 1 1

 makeup <- function(n, k){

  # your suggested solution #
 }

标签: rfunctionmathcombinationscombinatorics

解决方案


partitions这些被称为整数分区(更具体地说是受限制的整数分区),并且可以使用包或arrangements类似的方式有效地生成:

partitions::restrictedparts(9, 3, include.zero = FALSE)

[1,] 7 6 5 4 5 4 3
[2,] 1 2 3 4 2 3 3
[3,] 1 1 1 1 2 2 3

arrangements::partitions(9, 3)
     [,1] [,2] [,3]
[1,]    1    1    7
[2,]    1    2    6
[3,]    1    3    5
[4,]    1    4    4
[5,]    2    2    5
[6,]    2    3    4
[7,]    3    3    3

它们比由此提供的解决方案快得多:

library(microbenchmark)
microbenchmark(arrangePack = arrangements::partitions(20, 5),
               partsPack = partitions::restrictedparts(20, 5, include.zero = FALSE),
               myfun2(20, 5, 20),
               myfun1(20, 5, 20),
               makeup(20, 5),
               mycomb(20, 5), times = 3, unit = "relative")
Unit: relative
              expr          min           lq        mean       median          uq         max neval
       arrangePack     1.000000     1.000000    1.000000     1.000000    1.000000    1.000000     3
         partsPack     3.070203     2.755573    2.084231     2.553477    1.854912    1.458389     3
 myfun2(20, 5, 20) 10005.679667  8528.784033 6636.284386  7580.133387 5852.625112 4872.050067     3
 myfun1(20, 5, 20) 12770.400243 10574.957696 8005.844282  9164.764625 6897.696334 5610.854109     3
     makeup(20, 5) 15422.745155 12560.083171 9248.916738 10721.316721 7812.997976 6162.166646     3
     mycomb(20, 5)  1854.125325  1507.150003 1120.616461  1284.278219  950.015812  760.280469     3

事实上,对于下面的例子,其他函数会因为内存而报错:

system.time(arrangements::partitions(100, 10))
 user  system elapsed 
0.068   0.031   0.099 

arrangements::npartitions(100, 10)
[1] 2977866

推荐阅读