遍历任何大小的子集 [英] Iterating over subsets of any size

查看:149
本文介绍了遍历任何大小的子集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以遍历大小为1的子集

 的for(int a = 0; A<大小; A ++){
 

或大小为2的子集

 的(INT A1 = 0; A1中的大小; A1 ++){
    为(中间体A2 = A1 + 1; A2&所述;大小; A2 ++){
 

或3

 的(INT A1 = 0; A1中的大小; A1 ++){
为(中间体A2 = A1 + 1; A2&所述;大小; A2 ++){
   为(中间体A3 = A2 + 1; A3&所述;大小; A3 ++){
 

但如何做到这一点的大小为n的子集?

这做这项工作的基础上,由亚当·罗森菲尔德

答案

 无效迭代(INT *一,诠释我,诠释大小,INT N)
{
 INT开始= 0;
 如果(ⅰ大于0)开始= A [1-1] 1;
 为(A [1] =开始; A [1] n种; A [1] ++){
  如果(ⅰ==正 -  1){
      //一个是大小为n的指数数组
      对于(INT K = 0; K<大小; k ++){
          的printf(%D,一个[K]);
      }
      的printf(\ N);
  }
        其他
            迭代(A,I + 1,大小,n)的;
    }
}
 

解决方案

您可以使用递归:

 无效迭代(INT *一,诠释我,诠释大小,INT N)
{
    为(A [1] = 0;一[1]  - ;大小; A [1] ++)
    {
        如果(ⅰ== N-1)
            DoStuff(A,N); //一个是大小为n的指数数组
        其他
            迭代(A,I + 1,大小,n)的;
    }
}
...
//相当于4个嵌套的循环
int的一个[4];
迭代(一,0,大小,4);
 

I can iterate over the subsets of size 1

for( int a = 0; a < size; a++ ) {

or subsets of size 2

for( int a1 = 0; a1 < size; a1++ ) {
    for( int a2 = a1+1; a2 < size; a2++ ) {

or 3

for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
   for( int a3 = a2+1; a3 < size; a3++ ) {

But how to do this for subsets of size n?

This does the job, based on an answer by Adam Rosenfield

void iterate(int *a, int i, int size, int n)
{
 int start = 0;
 if( i > 0 ) start = a[i-1]+1;
 for(a[i] = start; a[i] < n; a[i]++) {
  if(i == n-1) {
      // a is the array of indices of size n
      for( int k = 0; k < size; k++ ) {
          printf("%d ",a[k]);
      }
      printf("\n");
  }
        else
            iterate(a, i+1, size, n);
    }
}

解决方案

You can use recursion:

void iterate(int *a, int i, int size, int n)
{
    for(a[i] = 0; a[i] < size; a[i]++)
    {
        if(i == n-1)
            DoStuff(a, n);  // a is the array of indices of size n
        else
            iterate(a, i+1, size, n);
    }
}
...
// Equivalent to 4 nested for loops
int a[4];
iterate(a, 0, size, 4);

这篇关于遍历任何大小的子集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆