当前位置:   article > 正文

C++ permutation排列算法详解(深入了解,一文学会)_c++ permutation函数

c++ permutation函数

排列就是一次对对象序列或值序列的重新排列。例如,“ABC”中字符可能的排列是:

"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"

三个不同的字符有 6 种排列,这个数字是从 3*2*1 得到的。一般来说,n 个不同的字 符有 n! 种排列,n! 是 nx(n_1)x(n-2)...x2x1。很容易明白为什么要这样算。有 n 个对象 时,在序列的第一个位置就有 n 种可能的选择。对于第一个对象的每一种选择,序列的第 二个位置还剩下 n-1 种选择,因此前两个有 nx((n-1) 种可能选择。在选择了前两个之后, 第三个位置还剩下 n-2 种选择,因此前三个有 nx(n-1)x(n-2) 种可能选择,以此类推。序列的末尾是 Hobson 选择,因为只剩下 1 种选择。

对于包含相同元素的序列来说,只要一个序列中的元素顺序不同,就是一种排列。next_permutation() 会生成一个序列的重排列,它是所有可能的字典序中的下一个排列,默认使用 < 运算符来做这些事情。它的参数为定义序列的迭代器和一个返回布尔值的函数,这个函数在下一个排列大于上一个排列时返回 true,如果上一个排列是序列中最大的,它返回 false,所以会生成字典序最小的排列。

本文作者原创,转载请附上文章出处与本文链接。

        

1 next_permutation()

是按照字典升序的方式生成的排列

该算法输入一组数组,打印出所有全排列

  1. #include <iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int main(int argc, char** argv) {
  5. int a[4] = { 1,2,3,4 };
  6. sort(a, a + 4);
  7. do {
  8. //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
  9. for (int i = 0; i < 4; i++)
  10. cout << a[i] << " ";
  11. cout << endl;
  12. } while (next_permutation(a, a + 4));
  13. return 0;
  14. }

2 prev_permutation()

是按照字典升序的方式生成的排列

  1. #include <iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. int main(int argc, char** argv) {
  6. std::vector<double> data{ 44.5, 22.0, 15.6, 1.5 };
  7. do {
  8. std::copy(std::begin(data), std::end(data), std::ostream_iterator<double> {std::cout, " "});
  9. std::cout << std::endl;
  10. } while (std::prev_permutation(std::begin(data), std::end(data)));
  11. return 0;
  12. }

3 is_permutation

  1. #include <iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. int main(int argc, char** argv)
  6. {
  7. std::vector<double> data1{ 44.5, 22.0, 15.6, 1.5 };
  8. std::vector<double> data2{ 22.5, 44.5, 1.5, 15.6 };
  9. std::vector<double> data3{ 1.5, 44.5, 15.6, 22.0 };
  10. auto test = [](const auto& d1, const auto& d2)
  11. {
  12. std::copy(std::begin(d1), std::end(d1), std::ostream_iterator<double> {std::cout, " "});
  13. std::cout << (is_permutation(std::begin(d1), std::end(d1), std::begin(d2), std::end(d2)) ? "is" : "is not") << " a permutation of ";
  14. std::copy(std::begin(d2), std::end(d2), std::ostream_iterator<double>{std::cout, " "});
  15. std::cout << std::endl;
  16. };
  17. test(data1, data2);
  18. test(data1, data3);
  19. test(data3, data2);
  20. return 0;
  21. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/826002
推荐阅读
相关标签
  

闽ICP备14008679号