高效点的全排列算法---堆算法(跟堆排序没关系)
第一种:
这是普通的实现:**
#include<iostream>
#include<time.h>
#include<algorithm>
using namespace std;//交换
void swap(int arr[],int i , int j)
{int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;} void Perm(int list[] , int k ,int m)
{//list 数组存放排列的数,k表示层 代表第几个数,m表示数组的长度if(k==m){//K==m 表示到达最后一个数,不能再交换,最终的排列的数需要输出;//for(int i=0 ;i<=m ;i++)// cout<<list[i];//cout<<endl; return ;} else{for(int i=k;i<=m;i++){swap(list, i, k);Perm(list,k+1,m);swap(list, i, k);}}
}
int main(void)
{clock_t t1 = clock();int a[10];for(int i = 0; i < 10; i ++) {a[i] = i;}int n = sizeof a/sizeof a[0]; Perm(a, 0, n); cout <<"time is "<< (clock() - t1) * 1.0 / CLOCKS_PER_SEC * 1000 << endl;return 0;
}
这种实现的时间复杂度为O(n*n!)
上面程序在我电脑上运行时间是:(单位秒)
10个数的全排列:
11个数的全排列:
第二种:
#include<iostream>
#include<time.h>
#include<algorithm> using namespace std; //交换
void swap(int arr[],int i , int j)
{int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;
} //打印
void printArr(int a[],int n)
{ for (int i=0; i<n; i++) cout << a[i] << " "; printf("\n");
} void heapPermutation(int a[], int size, int n)
{ if (size == 1) { //printArr(a, n); return; } for (int i=0; i<size; i++) { heapPermutation(a,size-1,n); if (size%2==1) //奇数swap(a,0,size-1); else //偶数swap(a,i,size-1); }
} int main()
{ clock_t t1 = clock();int a[11];for(int i = 0; i < 11; i ++) {a[i] = i;}int n = sizeof a/sizeof a[0]; heapPermutation(a, n, n); cout <<"time is "<< (clock() - t1) * 1.0 / CLOCKS_PER_SEC * 1000 << endl;return 0;
}
这个的时间复杂度可能是O(n!)
(我猜的)
10个数的全排列:
11个数的全排列
12个数的时候:
这个算法的描述:
见维基百科:
https://en.wikipedia.org/wiki/Heap%27s_algorithm#cite_note-3
截了些图想看就看吧,我是不想看了,会用就好(哈哈)
非递归伪代码:
非递归实现:
void heapPermutation2(int arr[],int n)
{int c[n];for(int i = 0; i < n; i++){c[i] = 0;}//printArr(arr,n);int i = 0;while(i < n){if(c[i] < i){if(i%2 == 0){swap(arr,0,i);}else{swap(arr,c[i], i);}// printArr(arr,n);c[i]++;i = 0;}else {c[i] = 0;i++;}}
}
小优化:
void heapPermutation(int a[], int size, int n)
{ if (size == 1) { //printArr(a, n); return; } for (int i=0; i<size; i++) { heapPermutation(a,size-1,n); if(i < size-1){if (size%2==1) swap(a,0,size-1); elseswap(a,i,size-1);} }
}
总结:虽然快了很多,但是很慢,13左右就要运行很久了。
高效点的全排列算法---堆算法(跟堆排序没关系)相关推荐
- 数据结构与算法——堆的原理和实现
目录 一.堆的原理 二.堆的实现 1.堆的定义 2.堆的初始化 3.向上调整算法 4.向上调整算法代码实现 5.堆的插入 6.向下调整算法 6.堆的删除 7.堆的大小 8.判断堆是否为空 总结 一.堆 ...
- 数据结构与算法---堆的基本操作
堆的定义 堆可以看做是一种特殊的树,堆结构满足两个条件: 1.堆是一个完全二叉树. 2.堆的每一个节点的值都大于等于(或小于等于)其子节点的值. 大于等于子节点的值我们叫它:大顶堆 小于等于子节点的值 ...
- 获取序列全排列Java,java中全排列的生成算法汇总
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...
- USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)
目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...
- 更高效的PacBio长read纠错算法的研究
更高效的PacBio长read纠错算法的研究 更高效的PacBio长read纠错算法的研究 中文摘要 第三代PacBio测序技术的长read已越来越广泛的应用于各类测序项目中,而降低其约15%的错误率 ...
- 如何高效准备2021届秋招算法岗面试?
作为一名程序员,你肯定想过:编程最本质的知识是什么?很多人都会说是算法与数据结构.为什么是算法?算法如何帮助程序员升级打怪?进大厂.升职加薪.找到女朋友..... 1 算法是去国内一线互联网公司的必要 ...
- 全排列的生成算法:字典序法
全排列的生成算法:字典序法 全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来. 字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...
- 数据结构与算法 | 堆
二叉树的顺序结构 堆的概念及结构 堆的实现 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费.而完全二叉树更适合使用顺序结构存储.现实中我们通常把堆(一种二叉树)使用 ...
- 在FAANG面试中破解堆算法
In FAANG company interview, Candidates always come across heap problems. There is one question they ...
最新文章
- 将Eclipse中Web项目打成war包
- LoadRunner监控Linux
- 第三十四课.模糊神经网络
- 6425C-Lab6 实现组策略
- is属性用法 vue_vue组件讲解(is属性的用法)模板标签替换操作
- 购买腾讯云主机后的快速配置
- MySQL5.7 常用系统表大全
- yarn的配置 -- 无法将“yo”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
- python人门指南小说-致Python初学者 Anaconda入门使用指南完整版
- kubernetes 查看日志方法
- [转]gluPerspective函数
- 腾讯云播放器 Demo与调用方法
- brctl 使用说明
- 看各路单词APP不顺手 索性自己写一个背单词系统
- Interview with Dustin Kirkland, Ubuntu Core Developer about encryption in Ubuntu
- tmall.item.add.simpleschema.get( 天猫发布商品规则获取 )
- Python几种常用的数据导入方法
- 后台管理系统日志(一个小插曲)
- 煮熟的鸡蛋这么用竟可治病
- c语言 单词首字母大写
热门文章
- 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
- python与office结合可以干什么-python与office(一)
- python自动化办公模块有哪些-Python自动化办公知识点整理汇总
- python代码翻译器-利用Python制作一款简单的翻译软件
- 离线语音控制并不等于本地语音识别
- 未来比较火的计算机领域,【火了】未来十年,中国人才最紧缺的6个专业!
- Promise的简单使用例子
- 【计算机网络笔记】交换方式:电路/分组/报文交换
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1
- html页面显示动态日期时间,如何在网页中动态显示当前日期和时间(js调用)