C++ 如何在C++;?

C++ 如何在C++;?,c++,algorithm,optimization,permutation,unordered-set,C++,Algorithm,Optimization,Permutation,Unordered Set,我试图解决一个问题,我觉得我真的很接近它,但它仍然有点慢,因为我产生了这么多的排列 我需要“0123456789”的排列。我知道有(10)大量的排列。 我使用std::unordered\u集,因为我不在乎它们的存储顺序,而且似乎比使用常规std::集 这里是我写的一些核心:max\u perm\u size是我关心的特定情况下的排列字符串的大小 void getPermutations(unordered_set<string> &permutations, int &am

我试图解决一个问题,我觉得我真的很接近它,但它仍然有点慢,因为我产生了这么多的排列

我需要“0123456789”的排列。我知道有(10)大量的排列。 我使用
std::unordered\u集
,因为我不在乎它们的存储顺序,而且似乎比使用常规
std::集

这里是我写的一些核心:
max\u perm\u size
是我关心的特定情况下的排列字符串的大小

void getPermutations(unordered_set<string> &permutations, int &max_perm_size)
{
    string digits = "0123456789";

    do{

        permutations.insert(digits.substr(0, max_perm_size));

    } while (next_permutation(digits.begin(), digits.end()));

}
void getPermutations(无序集和排列、int和max\u perm\u大小)
{
字符串数字=“0123456789”;
做{
置换.插入(数字.substr(0,最大置换大小));
}while(下一个排列(digits.begin(),digits.end());
}
关于此代码,我有两个主要问题:

  • 在上面,我仍然在生成整个“0123456789”排列,即使在我只关心大小的排列
    max\u perm\u size
    的情况下也是如此。我只是在将它们存储到我的
    std::unordered\u集合
    之前修剪它们。有没有更好的方法让它更快
  • 对于最坏的情况
    max_pem_size=10
    ,是否有更有效的方法来生成和存储所有这些排列
  • 您可以先获取数字字符串的子字符串。那么您的循环将只处理最大置换大小的置换

  • 您可以创建一个按需生成排列的类,而不是预先生成和存储排列。根据您的应用程序,您甚至不必存储它们

  • 您可以先获取数字字符串的子字符串。那么您的循环将只处理最大置换大小的置换

  • 您可以创建一个按需生成排列的类,而不是预先生成和存储排列。根据您的应用程序,您甚至不必存储它们


  • 这是特定于您的情况,不是一般的解决方案,但对于数字排列的情况,您可以执行以下操作:

    void getPermutations(unordered_set<string> &permutations, int max_perm_size)
    {
        if (max_perm_size < 1) return;
    
        uint64_t stopat = 1;
        for (int i = 1; i < max_perm_size; ++i) {
            stopat *= 10;
        }
    
        for (uint64_t dig = 0; dig < stopat; ++dig) {
            std::ostringstream ss;
            ss << std::setw(max_perm_size) << std::setfill('0') << dig;
            permutations.insert(ss.str());
        }
    }
    
    void getPermutations(无序的排列集和排列,整数最大排列大小)
    {
    if(max_perm_size<1)返回;
    uint64_t stopat=1;
    对于(int i=1;iss这是特定于您的情况,不是一般的解决方案,但对于数字排列的情况,您可以执行以下操作:

    void getPermutations(unordered_set<string> &permutations, int max_perm_size)
    {
        if (max_perm_size < 1) return;
    
        uint64_t stopat = 1;
        for (int i = 1; i < max_perm_size; ++i) {
            stopat *= 10;
        }
    
        for (uint64_t dig = 0; dig < stopat; ++dig) {
            std::ostringstream ss;
            ss << std::setw(max_perm_size) << std::setfill('0') << dig;
            permutations.insert(ss.str());
        }
    }
    
    void getPermutations(无序的排列集和排列,整数最大排列大小)
    {
    if(max_perm_size<1)返回;
    uint64_t stopat=1;
    对于(int i=1;iss据我所知,你的结果是从0到某个极限的数字(没有重复的数字)。因为你说你不关心数字的顺序,所以如果我们坚持升序,可能最简单。在这种情况下,我们可以生成如下结果:

    #include <iostream>
    
    int main() {
        for (int i=0; i<10; i++)
            for (int j=i+1; j<10; j++)
                for (int k=j+1; k<10; k++)
                    std::cout << i << j << k << "\t";
    }
    

    如果您的限制不是数字的数量,您可以将这些数字合并为实际整数并进行比较(然后打破循环)。

    据我所知,您的结果是数字(没有重复的数字)从0到某个限制。既然你说你不关心数字的顺序,那么如果我们坚持升序,可能最简单。在这种情况下,我们可以生成如下结果:

    #include <iostream>
    
    int main() {
        for (int i=0; i<10; i++)
            for (int j=i+1; j<10; j++)
                for (int k=j+1; k<10; k++)
                    std::cout << i << j << k << "\t";
    }
    

    如果您的限制不是数字的数量,您可以将这些数字合并成一个实际的整数并进行比较(然后打破循环).

    我应该遗漏了一些东西…你真的想要排列吗?如果是这样,为什么你要使用无序集来返回它们?你不想要组合吗?甚至不看算法,看起来你只是想用数字填充数据结构,也许以后再对其进行迭代。
    无序集
    会产生积极影响如果可能的话,请销毁缓存,尝试使用
    向量
    。@olivecoder我相信我想要排列,是的。@tux3我使用集合的原因是,使用向量时,我每次都必须检查向量,以确保不添加重复排列。例如,如果我需要大小仅为2的排列,我会得到(01)在到达(02)等之前,有很多次。集合只存储那些不在集合中的/@JerryCoffin我明白你的意思,我想这就是我寻找的方向。我遇到的问题是,我想要所有大小为2的排列。我需要{(0,1),(0,2),(0,3)…(1,0)。(1,2)…(1,8)…(9,8)}我应该遗漏了一些东西…你真的想要排列吗?如果是这样,为什么你要使用无序集来返回它们?你不想要组合吗?甚至不看算法,看起来你只是想用数字填充数据结构,然后可能会对其进行迭代。
    无序集
    将对数据结构产生积极影响特洛伊你的缓存,尽可能尝试使用
    向量
    。@olivecoder我相信我想要排列,是的。@tux3我使用集合的原因是因为使用向量时,我每次都必须检查向量,以确保不添加重复排列。例如,如果我需要大小只有2的排列,我会得到(01)在到达(02)等之前,我做了很多次。集合只存储那些不在集合中的/@JerryCoffin我明白你的意思,我想这就是我要寻找的方向。我遇到的问题是,我想要所有大小为2的排列。我需要{(0,1),(0,2),(0,3)…(1,0)。(1,2)…(1,8)…(9,8)}你能谈谈发生了什么事吗?我对这件事还很陌生,很难跟上@