我如何生成一次与其他约束的R中一次(n)次数(n)的向量(n)(n)的所有可能排列的列表



例如,假设我想在系列1:10中生成所有可能的排列。但是,所选的3个数字必须按顺序排列。因此,3,4,5是可以接受的,但不能接受5,4,3。第二个条件是他们不能跳跃,必须是连续的。因此,1,2,4是不可接受的。如何在R?

中获得此功能

我们可以使用combn创建数字组合,然后通过检查行的差异等于1来通过创建逻辑索引来对列进行子集,并转置输出

m1 <- combn(1:10, 3)
t(m1[,colSums(diff(m1)==1)==2])
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    2    3    4
#[3,]    3    4    5
#[4,]    4    5    6
#[5,]    5    6    7
#[6,]    6    7    8
#[7,]    7    8    9
#[8,]    8    9   10

这些由序列1:3、2:4,...,8:10组成。通常,要在1:n中获得所有这些长度k的子序列,您可以从最小的1:k开始,并继续向其元素添加1个:

subseq <- function(n,k) if (1 <= k && k <= n) outer(1:k, 0:(n-k), "+")

序列在列中,已经按词典顺序。由于实际上没有进行排序,因此这是O(kn(算法,它在渐近最佳。

示例:subseq(10,3)产生

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    2    3    4    5    6    7    8    9
[3,]    3    4    5    6    7    8    9   10

R实现速度稍快,可能会避免使用outer

subseq <- function(n=10, k=3) if (1 <= k && k <= n)  matrix(rep(0:(n-k), each=k), k) + 1:k

最新更新