美文网首页
生成全排列算法(Scala和C++实现)

生成全排列算法(Scala和C++实现)

作者: pangolulu | 来源:发表于2016-04-17 17:34 被阅读427次

    全排列问题描述为:给定一串数字,生成所有可能的排列。
    本文给出两类,一种使用C++通过回溯算法,一种使用Scala通过递归来求解。

    首先介绍使用Scala通过递归求解的方法,定义递归关系:对S中的每个x,递归的生成S-x的所有排列的序列,而后将x加到每个序列的前面。这样就能对S里的每个x,产生出了S的所有以x开头的排列。合起来就是所有的排列了。
    实现的代码如下:

    def permutation(xs: List[Int]): Set[List[Int]] =
      if (xs == Nil) Set(Nil)
      else {
        for {
          i <- xs.indices
          ys <- func(xs filter (_ != xs(i)))
        }   yield xs(i) :: ys
      }.toSet
    
    func(List(1, 2, 3))
    

    使用回溯法的代码如下:

    void permutation(vector<int> vec, int s) {
        if (s == vec.size()) {
            for_each(vec.begin(), vec.end(), [](int v) { cout << v << " "; });
            cout << endl;
        }
    
        for (int i = s; i < vec.size(); i++) {
            swap(vec[s], vec[i]);
            func(vec, s+1);
            swap(vec[s], vec[i]);
        }
    }
    

    其中,函数参数s表示的是当前序列已经有多少位完成了排列,即前s位完成了排列,当前正在对第s位进行排列。取所有ssize - 1位置的元素作为第s位的数字。回溯的意义是在执行完递归func(vec, s+1);后,需要将之前交换过的元素交换回来,即需要将数组回复原状。

    综上,觉得使用Scala的递归思想考虑还是比较简单的,但效率不敢恭维。

    相关文章

      网友评论

          本文标题:生成全排列算法(Scala和C++实现)

          本文链接:https://www.haomeiwen.com/subject/vybolttx.html