我被分配了编写C ++函数的任务,该函数从一组整数中返回所有可能的排列。我做了一些研究,但我找到的所有算法都显示了打印出的排列。
我遇到的问题是我不知道如何设置该功能,具体来说,我应该如何处理从递归调用接收数据。我的第一个猜测是使用链表,但我知道如果我尝试返回指向节点的指针,我最终会得到指向无效内存的指针。
我的另一个猜测是使用某种全局链接的向量列表,但我无法想象如何从函数本身添加到链表。此外,这比解决问题更能回避问题,而且如果可能的话,我想实际解决问题。
由于这是一个家庭作业问题,我不希望任何人直接给我一个答案。我只是输了,非常感谢有人指着我正确的方向。
答案 0 :(得分:3)
您可以使用std::next_permutation
。它在数据结构上运行,因此您可以在每次迭代后使用数据结构执行任何操作。
如果您正在实施自己的排列逻辑,假设您在vector<int>& data
上运行,则可以在递归函数中添加vector<vector<int> >& result
之类的参数。每次生成排列时,您只需执行result.push_back(data)
。
答案 1 :(得分:1)
一种可能的方法:将集合存储在一个数组中,然后调用一个函数给它一个数组(一个ptr到第一个项目),并将数组长度作为参数。确保数组最初是按照升序排序的,然后在每次调用时将其重新排序为“词法下一个”排列。
答案 2 :(得分:1)
您可以使用next_permutation
并累积所有排列的副本:
template<class T>
vector<vector<T>> permutations(vector<T> input) {
vector<vector<T>> result{input};
while (next_permutation(begin(input), end(input)))
result.push_back(input);
return result;
}
由于这是一个家庭作业问题,我希望你必须自己生成排列。但这指向一种方法 - 有一个vector<vector<T>>
类型的累加器,并将其作为参考参数传递给算法的递归版本:
template<class T>
vector<vector<T>> permutations(const vector<T>& input) {
vector<vector<T>> output;
collect_permutations(input, output);
return output;
}
template<class T>
void collect_permutations(const vector<T>& input, vector<vector<T>>& output) {
// Instead of printing, simply write to output using push_back() etc.
}
答案 3 :(得分:0)
如果你实际上只想要组合(返回集合中的项目顺序并不重要),那么我会使用二进制计数器方法 - 对于N个项目的源集合,定义一个N位二进制计数器和从0到2 ^ N-1的计数 - 计数器中的每个位对应于N个项中的一个,并且每个数字表示组合中仅存在具有1位的项的组合。
对于排列,您必须在每个单独的组合中生成所有可能的项目排序,以及在必要时消除重复项的某种方式。