组合的并行化

时间:2016-10-05 07:58:23

标签: c algorithm mpi openmp

我有一段代码打印出M编号从N(nCm);

的组合

由于它是递归,当N很大时,它的工作速度很慢。

#include <stdio.h>
#include <stdlib.h>

#define N  80
#define M  4

int result[M]= {0}; // THE ARRAY THAT SAVE THE RESULT OF ONE COMBINATION
int queue[N] = {0};
int top = 0;

void comb(int* input,int s, int n, int m)
{
    if (s > n)
        return ; 

    if (top == m)
    {
        for (int i = 0; i < m; i++)
        {
            result[i] = queue[i];
            printf("%d\n", queue[i]);
        }
     }

     queue[top++] = input[s];
     comb(input,s+1, n, M);
     top--;
     comb(input,s+1, n, M);
}

int main()
{  
   int array[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
                  27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
                  50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,
                  73,74,75,76,77,78,79,80};

    printf("\ncombination():\n");
    comb(array,0, N, M);
    printf("\n");
}

我想知道上述算法是否有任何改进空间? 如果可能的话,我可以使用openMP吗?

由于

1 个答案:

答案 0 :(得分:0)

对我来说,你的代码甚至提供了所需的输出。 see

我已经改变了

  1. 打印格式每种组合都不够好。
  2. 重复组合。 (注意:if语句的其中一部分已添加)。
  3. 使用循环和递归调用减少了2个递归调用。 (减少空间。)
  4. 所需的代码是:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N  20
    #define M  6
    
    int result[M]= {0}; // THE ARRAY THAT SAVE THE RESULT OF ONE COMBINATION
    int queue[N] = {0};
    int top = 0;
    
    void comb(int* input,int s, int n, int m)
    {
        if (s > n)
            return ; 
    
        if (top == m)
        {
            printf("\n");
            for (int i = 0; i < m; i++)
            {
                result[i] = queue[i];
                printf("%d ", queue[i]);
            }
         }else{
             for(int ss=s;ss<n;ss++){
                queue[top++] = input[ss];
                comb(input,ss+1, n, m);
                top--;
             }
             //comb(input,s+1, n, m);   
         }
    }
    
    int main()
    {  
       int array[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
                      27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
                      50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,
                      73,74,75,76,77,78,79,80};
    
        printf("\ncombinations():\n");
        comb(array,0, N, M);
        printf("\n");
    }