C ++以递归方式生成集合的排列

时间:2014-04-14 16:18:21

标签: c++ algorithm recursion

我被分配了编写C ++函数的任务,该函数从一组整数中返回所有可能的排列。我做了一些研究,但我找到的所有算法都显示了打印出的排列。

我遇到的问题是我不知道如何设置该功能,具体来说,我应该如何处理从递归调用接收数据。我的第一个猜测是使用链表,但我知道如果我尝试返回指向节点的指针,我最终会得到指向无效内存的指针。

我的另一个猜测是使用某种全局链接的向量列表,但我无法想象如何从函数本身添加到链表。此外,这比解决问题更能回避问题,而且如果可能的话,我想实际解决问题。

由于这是一个家庭作业问题,我不希望任何人直接给我一个答案。我只是输了,非常感谢有人指着我正确的方向。

4 个答案:

答案 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位的项的组合。

对于排列,您必须在每个单独的组合中生成所有可能的项目排序,以及在必要时消除重复项的某种方式。