【万能搜索】万能DFS之全排列(一)——普通算法
2017-12-03 13:53
253 查看
DFS相信大家都很熟悉,下面就给出一种用DFS实现的算法。
123
132
213
231
312
321
这六种。
现在,我们来设计一个算法,来求出所有全排列。
不难看出,这个算法时间复杂度为O(n2×n!)O(n2×n!)。非常慢。
这个算法时间复杂度也比较慢,为O(n×n!)O(n×n!)。
是很NB吧,还自带字典序输出。没错,这就是万能的algorithm库里面的next_permutation函数!它能在O(n!)O(n!)的时间复杂度求出所有全排列!这是已知的、最快的求出全排列的方法。还可以处理重复元素!
关于这个算法的实现方法,我们下节再论。
搜索系列文章:
1. 【未完】【万能搜索】万能DFS之全排列(二)——next_permutation详解
2. 【未完】【万能搜索】万能BFS之最短路(一)——走迷宫
3. 【未完】【万能搜索】万能BFS之最短路(二)——详解八数码问题
全排列
大家对于全排列是很熟悉的,比如123的全排列就有:123
132
213
231
312
321
这六种。
现在,我们来设计一个算法,来求出所有全排列。
一个暴力算法
在全排列中,我们只需不停地试每一个元素所在的位置,再根据全排列中同一元素只出现一次,就可以暴力枚举出全排列。//暴力实现 bool check(int x,int i) { for(int k=1;k<=x;k++) if(ans[k]==a[x])return 0; return 1; } void dfs(int x) { if(x>n) { Print();//输出 return;//千万不要打掉这句 //不打会将一个排列输出两次 } for(int i=1;i<=n;i++)//n是长度 if(check(x,i)) { ans[x]=a[i]; dfs(x+1); } }
不难看出,这个算法时间复杂度为O(n2×n!)O(n2×n!)。非常慢。
暴力算法v2.0
其实我们可以仔细想想,在ans数组中,每个元素只对应原数组的唯一一个位置,所以,我们就可以利用这一性质,用O(1)O(1)的时间来找出值。//暴力实现v2.0 void dfs(int x) { if(x>n) { Print(); return; } for(int i=1;i<=n;i++) if(!bo[i]) { ans[x]=a[i]; bo[i]=1; dfs(x+1); bo[i]=0;//不打这句你会死得很惨 } }
这个算法时间复杂度也比较慢,为O(n×n!)O(n×n!)。
一个看上去很NB的算法
先给代码:#include<cstdio> #include<algorithm> using namespace std; int a[101],n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+n+1); do Print(); while(next_permutation(a+1,a+n+1)); return 0; }
是很NB吧,还自带字典序输出。没错,这就是万能的algorithm库里面的next_permutation函数!它能在O(n!)O(n!)的时间复杂度求出所有全排列!这是已知的、最快的求出全排列的方法。还可以处理重复元素!
关于这个算法的实现方法,我们下节再论。
搜索系列文章:
1. 【未完】【万能搜索】万能DFS之全排列(二)——next_permutation详解
2. 【未完】【万能搜索】万能BFS之最短路(一)——走迷宫
3. 【未完】【万能搜索】万能BFS之最短路(二)——详解八数码问题
相关文章推荐
- 【算法专题】【搜索】【DFS】枚举全排列
- Java常用算法——搜索(dfs) & 回溯(全排列、八皇后、分苹果问题的详细解析)
- 啊哈算法DFS应用之全排列
- 【算法入门】广度/宽度优先搜索(DFS)
- 【算法——02】图的遍历——BFS广度优先搜索、DFS深度优先搜索
- BFS和DFS优先搜索算法
- 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher(迪杰斯特拉乱用) H.老子的全排列呢(dfs)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 万能的搜索--之DFS(二)
- 蓝桥杯 算法训练 单词接龙 _DFS_搜索 字符串比较
- 算法总结—深度优先搜索DFS
- 《啊哈!算法》第4章 万能的搜索
- 深度优先搜索dfs之1到n的全排列(收藏)
- 啊哈算法搜索应用之宝岛探险(BFS和DFS)
- 【算法入门】广度/宽度优先搜索(DFS)
- 蓝桥杯 算法提高 3000米排名预测 DFS 递归搜索 next_permutation()使用
- 搜索DFS算法
- 蓝桥杯 算法提高3000米排名预测(全排列,dfs,bfs)
- 【算法分类】【搜索】【DFS】枚举所有子集
- 深度优先搜索 DFS 算法摘记