中获得此功能
例如,假设我想在系列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