使用递归组合到子集数组

时间:2015-01-08 05:04:14

标签: c++ r recursion rcpp

我最近发布了一个关于如何使用递归来估计C ++中所有下三角组合的问题。我设法找到一个递归算法,给出一个大小为n的数组,生成并打印数组中r元素的所有可能组合。我在R中使用Rcpp使用了这个函数。然后我在这个函数周围写了一个循环,得到组合r到r + n的所有子集。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int recursive(IntegerVector arr, IntegerVector data, int start, int end, int index, int r)
{
    if (index == r)
  {
    for (int j=0; j<r; j++)
        printf("%d ", data[j]);
    printf("\n");
  }

  for (int i=start; i<=end && end-i+1 >= r-index; i++)
    {
    data[index] = arr[i];
    recursive(arr, data, i+1, end, index+1, r);
    }

}

有五组的R代码:

Rcpp::sourceCpp('recursive2.cpp')
nComm <- 5
r <- c(2:nComm)
n <- nComm
arr <- c(1:nComm)
dat <- c(1:nComm)
for(i in 1:(n-1)){
   recursive(arr, dat, 0, n-1, 0, r[i])
}
1 2 
1 3 
1 4 
1 5 
2 3 
2 4 
2 5 
3 4 
3 5 
4 5 
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 
1 2 3 4 
1 2 3 5 
1 2 4 5 
1 3 4 5 
2 3 4 5 
1 2 3 4 5  

目前,这只是打印我需要的组合子集来估计我的差异。我希望能够删除循环并将其用作单个Rcpp函数/脚本。最终目标是能够使用子集(当前打印的组合)作为数组中子行的子集。这将用于计算向量之间的相交。因此,1 2将用于比较数组中的行12。等等。

0 个答案:

没有答案