一共有三种求全排列的方式:

第一种就是只适合用于非可重集的DFS实现

第二种就是可以用于可重集上的刘汝佳书上的代码

第三种就是STL中的next——permutation

在对这三种方式做了比较之后发现:

DFS实现的效率最高,当n = 10的时候耗时才不到2s,但是n = 11的时候耗时14s

这是因为在求排列的时候DFS没有去判断这个元素在集合中是否重复的出现过,只是直接的去判断vis数组

第二种方式刘汝佳的实现方式,效率比较的低,甚至不如STL中的next——permuation函数,但是我猜想STL中的实现方式和刘汝佳的差不多

第三种方式使用的时候必须要先把所要求全排列的集合进行排序。

综上所述:

以后遇到求全排列的时候,如果是非可重集,那么使用DFS(实际上还是一个递归的过程,即分治,结合)

如果是可重集,那么直接使用STL

下面附上第一种和第三种的代码

//STL实现方式
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;const int maxn1 = 100 + 10;
int A1[maxn1];
int main()
{for(int i = 1;i <= 10;i++){A1[i] = i;}do{for(int i = 1;i <= 20;i++){printf("%d ",A1[i]);}printf("\n");}while(next_permutation(A1 + 1,A1 + 1 + 10));printf("%lf",(double)clock()/CLOCKS_PER_SEC);return 0;
}

//有的人把这种实现方式称作DFS的方式?
//但是DFS虽然是递归实现的,但是它在决定下一次递归的时候是考虑和当前点的关系的
//所以我更倾向于称这种方式为递归实现的方式
//但是里面还是有很多图论中的味道的。
#include<cstdio>
#include<cstring>
#include<ctime>
using namespace std;const int maxn = 100 + 10;
int ans[maxn];
int vis[maxn];
int A2[maxn];
void print_permutation1(int cur ,int n)
{if(cur > n){for(int i = 1; i <= n;i++){printf("%d ",ans[i]);}printf("\n");}else for(int i = 1; i <= n;i++){if(!vis[i]){vis[i] = 1;ans[cur] = A2[i];print_permutation1(cur + 1,n);vis[i] = 0;}}
}int main()
{for(int i = 1;i <= 11;i++){A2[i] = i;}memset(vis,0,sizeof(vis));print_permutation1(1,11);printf("%lf",(double)clock()/CLOCKS_PER_SEC);return 0;
}

转载于:https://www.cnblogs.com/TorettoRui/p/10466388.html

三种求全排列方式之比较相关推荐

  1. 了解mysql的三种不同安装方式的区别

    学习目的:了解mysql的三种不同安装方式的区别 学习内容: mysql 的安装有三种:分别是源码安装.二进制安装.rpm安装. 源码安装的优势:linux操作系统开放源代码,因此在其上面安装的软件大 ...

  2. lvs的调度算法有几种_LVS:三种负载均衡方式比较

    1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...

  3. 多角度对比数据中心常见的三种走线方式

    01 三种走线方式的施工图片 ▽下走线(地板下走线) ▽天花吊顶上走线 ▽机柜顶部走线 02 三种走线方式对比 通过上面的比较,毫无疑问,机柜顶部走线模式是最有优势的,给用户带来很多好处,包括维护方便 ...

  4. asp.net session 介绍一三种Session存储方式

    asp.net session 介绍一三种Session存储方式 www.firnow.com 时间:2009-03-04 作者:匿名 编辑:sky 点击: 1478 [评论] 对于asp.net的程 ...

  5. Apache Spark探秘:三种分布式部署方式比较

    2019独角兽企业重金招聘Python工程师标准>>> 目前Apache Spark支持三种分布式部署方式,分别是standalone.spark on mesos和 spark o ...

  6. spark on yarn 完全分布式_Apache Spark探秘:三种分布式部署方式比较

    [本文详细介绍了Spark的三种部署方式及其比较,欢迎读者朋友们阅读.转发和收藏!] 目前Apache Spark支持三种分布式部署方式,分别是 standalone . spark on mesos ...

  7. LVS:三种负载均衡方式比较+另三种负载均衡方式

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  8. LVS:三种负载均衡方式比较

    1.什么是LVS?   首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具 ...

  9. 网络资产管理系统_固定资产管理系统的三种网络架构方式

    随着互联网技术的发展和信息技术的广泛使用,固定资产管理系统在各行业的应用越来越普及,固定资产管理系统作为当今主流的企业固定资产信息化管理模式,能够对企业固定资产进行有效管理并提升企业的管理水平.对于固 ...

最新文章

  1. 使用javaservice 将jboss 注册为服务
  2. mysql now unixtime_MySQL时间函数from_unixtime()date_format()unix_timestamp()now()使用说明
  3. mysql 主备及时_MySQL高可用(二)主备延时如何解决?
  4. 每次创建maven都要重新设置set,如何将本地maven设置为默认的maven
  5. 新建虚拟机与window的连接
  6. 【视觉项目】【day6】8.26关于matchTemplate()以及NCC的思考整理
  7. java面向对象的理解_java胜于C语言,却又静态面向对象,简单?
  8. 18.外部相机校准——旋转(Rotation),R是什么样子的,绕Z轴旋转的例子,齐次坐标旋转_2
  9. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
  10. 楼主,不知道为什么这么流行
  11. Vulkan开发实战详解
  12. 基于PaddleX的垃圾分类识别
  13. 物流行业如何利用智慧物流体系实现转型升级?
  14. 关于FRM这些事,你必须完全知道!
  15. meo学习笔记4:C++中对象占用内存情况
  16. C++,OpenCV 中template(模板)的简单理解
  17. 深大计算机图形学大作业之虚拟场景建模
  18. Theme Studio(主题工作室)
  19. 音频数据格式:PCM,WAV,MIDI
  20. FastDDS Getting Started (1) 运行HelloWorldExample并创建Fast DDS publisher

热门文章

  1. 通过代理进行页面传值
  2. linux终端中运行网银盾,Linux下使用Virtualbox安装 Windows 7 操作网银攻略
  3. 聊天软件系统测试用例,QQ聊天框测试用例设计
  4. ensp 路由表_华为模拟器ensp——静态路由实验
  5. java saf_Java 8 Lambda表达式探险
  6. java ee 6 sdk中文版,Java EE 6 SDK+Eclipse JEE+Android ADT-Fun言
  7. python导入类有红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...
  8. mysql 联接结果集函数_Oracle 中函数如何返回结果集
  9. php etcd 服务发现,confd+etcd+nginx 实现简单服务发现
  10. 使用cv2.Sobel()、cv2.Scharr()、cv2.Laplacian()寻找图像的梯度、边缘