Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
置换算法C++; 我尝试翻译一个生成C++中所有n个k的置换的算法: public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) { if (k == 0) { if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){ this.meilleureEquipe = L; this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe); } } else { for (Nageur x : F) { ArrayList<Nageur> G = new ArrayList<Nageur>(F); G.remove(G.indexOf(x)); ArrayList<Nageur> L2 = new ArrayList<Nageur>(L); L2.add(x); calculerEquipeTOT(L2, G, k - 1); } } } public void calculerequipmetot(ArrayList L,ArrayList F,int k){ 如果(k==0){ 如果(CalcullerPointStot(L)>此.PointsMilleureEquipe){ 这个。meilleureEquipe=L; this.pointsMilleureEquipe=计算点Stot(meilleureEquipe); } }否则{ 对于(纳格尔x:F){ ArrayList G=新的ArrayList(F); G.remove(G.indexOf(x)); ArrayList L2=新的ArrayList(L); L2.加入(x); 计算设备(L2,G,k-1); } } }_C++_Algorithm_Permutation - Fatal编程技术网

置换算法C++; 我尝试翻译一个生成C++中所有n个k的置换的算法: public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) { if (k == 0) { if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){ this.meilleureEquipe = L; this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe); } } else { for (Nageur x : F) { ArrayList<Nageur> G = new ArrayList<Nageur>(F); G.remove(G.indexOf(x)); ArrayList<Nageur> L2 = new ArrayList<Nageur>(L); L2.add(x); calculerEquipeTOT(L2, G, k - 1); } } } public void calculerequipmetot(ArrayList L,ArrayList F,int k){ 如果(k==0){ 如果(CalcullerPointStot(L)>此.PointsMilleureEquipe){ 这个。meilleureEquipe=L; this.pointsMilleureEquipe=计算点Stot(meilleureEquipe); } }否则{ 对于(纳格尔x:F){ ArrayList G=新的ArrayList(F); G.remove(G.indexOf(x)); ArrayList L2=新的ArrayList(L); L2.加入(x); 计算设备(L2,G,k-1); } } }

置换算法C++; 我尝试翻译一个生成C++中所有n个k的置换的算法: public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) { if (k == 0) { if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){ this.meilleureEquipe = L; this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe); } } else { for (Nageur x : F) { ArrayList<Nageur> G = new ArrayList<Nageur>(F); G.remove(G.indexOf(x)); ArrayList<Nageur> L2 = new ArrayList<Nageur>(L); L2.add(x); calculerEquipeTOT(L2, G, k - 1); } } } public void calculerequipmetot(ArrayList L,ArrayList F,int k){ 如果(k==0){ 如果(CalcullerPointStot(L)>此.PointsMilleureEquipe){ 这个。meilleureEquipe=L; this.pointsMilleureEquipe=计算点Stot(meilleureEquipe); } }否则{ 对于(纳格尔x:F){ ArrayList G=新的ArrayList(F); G.remove(G.indexOf(x)); ArrayList L2=新的ArrayList(L); L2.加入(x); 计算设备(L2,G,k-1); } } },c++,algorithm,permutation,C++,Algorithm,Permutation,我的问题是列表可能是对象列表,我不知道如何删除L2列表的x。。。我不是C++专家,我用java来管理它,但是我必须用C++来做。p> 我已经音译了你的函数,我得到了以下内容 #include <iostream> #include <list> #include <iterator> void arrangements( std::list<char> l, std::list<char> f, size_t k ) { i

我的问题是列表可能是对象列表,我不知道如何删除L2列表的x。。。我不是C++专家,我用java来管理它,但是我必须用C++来做。p> 我已经音译了你的函数,我得到了以下内容

#include <iostream>
#include <list>
#include <iterator>

void arrangements( std::list<char> l, std::list<char> f, size_t k ) 
{
    if ( k == 0 ) 
    {
        for ( char c : l ) std::cout << c << ' ';
        std::cout << std::endl;
    } 
    else 
    {
        for ( auto it = f.begin(); it != f.end(); ++it )
        {
            std::list<char> g( f.begin(), it );
            g.insert( g.end(), std::next( it ), f.end() );

            std::list<char> l2( l );
            l2.push_back( *it );

            arrangements( l2, g , k-1 );
        }
    }
}

int main()
{
    std::list<char> f = { 'A', 'B', 'C', 'D' };

    arrangements( std::list<char>(), f, 2 );
}
我不知道这是否是你想要的

如果调用k等于3的函数,则程序输出将为

A B C 
A B D 
A C B 
A C D 
A D B 
A D C 
B A C 
B A D 
B C A 
B C D 
B D A 
B D C 
C A B 
C A D 
C B A 
C B D 
C D A 
C D B 
D A B 
D A C 
D B A 
D B C 
D C A 
D C B 

我找到了一种方法,可以使用标准库中的next_permutation()和本文中的另一个next_composition()实现我想要的功能:

我的解决方案:

int main(int argc, const char * argv[]) {

    cout << "Hello, World!\n";
    int nb = 0;

    int tab1[] = {0,1,2,3};
    vector<int> n (tab1, tab1+sizeof tab1 / sizeof tab1[0]);
    int tab2[] = {0,1};
    vector<int> r (tab2, tab2+sizeof tab2 / sizeof tab2[0]);

    sort (n.begin(), n.end());
    do
    {
        sort(r.begin(),r.end());
        //do your processing on the new combination here
        vector<int> r2 = r;
        do
        {
            //do your processing on the new permutation here
            nb++;
            display_vector(r2);
            cout << endl;
        }
        while(next_permutation(r2.begin(),r2.end()));
    }
    while(next_combination(n.begin(),n.end(),r.begin(),r.end() ));

    cout << "Number of possibilities = " << nb << endl;

    return 0;
}
在我的电脑上找到12个排列中的10个不到1秒。。。我不知道这是否是一个好的算法,但它比我以前的Java算法要快


如果有人看到如何改进和优化它,我很感兴趣!:)

实际上使用它有什么错?因为我知道std::next_排列在排序数组上工作,我想使用像vector这样的对象列表,例如no?@TerryBlain no.
std::next_排列
将帮助您计算范围内的所有排列:
std::vector ps=。。。;do{doSomething(ps);}while(std::next_置换(ps.begin(),ps.end())。请参阅示例和详细参考。好的,谢谢@stefan,但事实上我必须找到n的所有k置换…@TerryBlain我认为你实际上不是指“置换”,而是指“子集”。如果我理解正确的话,您正在搜索大小为n的集合S的大小为k的所有子集,对吗?在这种情况下,排列不能让你接近正确的解决方案。这正是我想要的(我已经用java代码更新了这个话题,但是我不知道它是否是最有效的方法。”Terry Blain我也不知道。)Terry Blain C++的算法效率不高。最好不要创建新的列表G,而在递归调用中使用相同的列表F。:@Terry Blain似乎也最好使用列表的方法切片并通过引用传递列表。我只是简单地快速翻译了您最初在伪代码中显示的内容。所以你可以自己改进代码。:)是的,我对更好的性能感兴趣。。你到底是什么意思?谢谢你,顺便说一句!
int main(int argc, const char * argv[]) {

    cout << "Hello, World!\n";
    int nb = 0;

    int tab1[] = {0,1,2,3};
    vector<int> n (tab1, tab1+sizeof tab1 / sizeof tab1[0]);
    int tab2[] = {0,1};
    vector<int> r (tab2, tab2+sizeof tab2 / sizeof tab2[0]);

    sort (n.begin(), n.end());
    do
    {
        sort(r.begin(),r.end());
        //do your processing on the new combination here
        vector<int> r2 = r;
        do
        {
            //do your processing on the new permutation here
            nb++;
            display_vector(r2);
            cout << endl;
        }
        while(next_permutation(r2.begin(),r2.end()));
    }
    while(next_combination(n.begin(),n.end(),r.begin(),r.end() ));

    cout << "Number of possibilities = " << nb << endl;

    return 0;
}
Hello, World!
0 1 
1 0 
0 2 
2 0 
0 3 
3 0 
1 2 
2 1 
1 3 
3 1 
2 3 
3 2 
Number of possibilities = 12