C++ 如何在C++;?
我试图解决一个问题,我觉得我真的很接近它,但它仍然有点慢,因为我产生了这么多的排列 我需要“0123456789”的排列。我知道有(10)大量的排列。 我使用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
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());
}
关于此代码,我有两个主要问题:
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;i ss这是特定于您的情况,不是一般的解决方案,但对于数字排列的情况,您可以执行以下操作:
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;i ss据我所知,你的结果是从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)}你能谈谈发生了什么事吗?我对这件事还很陌生,很难跟上@