如何生成大小为n的所有向量,其中每个元素可能包含m个不同值中的1个?

时间:2017-10-12 14:40:04

标签: c++ vector permutation

很抱歉,如果这是重复的,但我没有找到任何符合我的答案。

考虑我有一个包含3个值的向量。我想从这个向量构造另一个指定长度的向量。例如,假设长度n=3和向量包含以下值0 1 2。我期望的输出如下:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2

我当前的实现只是根据n构造循环并生成预期的输出。我希望能够在输入向量中构造不同长度和不同值的输出向量。

我已经查看了使用next_permutation的可能实现,但不幸的是,传递长度值似乎不起作用。

是否有时间和复杂性算法可用于此案例?同样,我可能会计算n=17以及6周围的向量尺寸。

以下是n=3的实施情况。这里,enc是包含输入的向量。

vector<vector<int> > combo_3(vector<double>enc,int bw){
    vector<vector<int> > possibles;
    for (unsigned int inner=0;inner<enc.size();inner++){
        for (unsigned int inner1=0;inner1<enc.size();inner1++){
            for (unsigned int inner2=0;inner2<enc.size();inner2++){
              cout<<inner<<" "<<inner1<<" "<<inner2<<endl;
              unsigned int arr[]={inner,inner1,inner2};
              vector<int>current(arr,arr+sizeof(arr)/sizeof(arr[0]));
              possibles.push_back(current);
              current.clear();
    }
    }
}
    return possibles;
}

1 个答案:

答案 0 :(得分:0)

你在做什么是简单的计算。将输出向量视为数字列表(向量的向量)列表。每个数字可能有一个 m 不同的值,其中 m 是输入向量的大小。

这不是排列生成。生成每个排列意味着生成输入向量的每个可能的排序,这不是您正在寻找的。

如果您认为这是一个计数问题,答案可能会让您更清楚。例如,如何生成5位数的所有基数为10的数字?在这种情况下,输入向量的大小为10,输出列表中的每个向量的长度为5。