算法分析——Perm算法

算法设计与分析——Johnson Trotter算法 C语言、JavaScript语言、算法设计与分析、排列与组合算法、Johnson-Trotter算法、生成排列 阅读详情

目录


前言

Perm算法是一种解决全排列问题的思想,它是递归的一个实例。


一、递归算法

一个直接或间接地调用自身的算法成为递归算法。递归算法有两个基本组成元素:递归方程(一个使用函数自身给出定义的函数)和边界条件。

 在合并排序和快速排序一问中,我总结了分治策略在大规模问题中的引用。递归算法与分治策略都是将分体划分后重复调用并求解的过程,区别在于递归算法是已知问题的结果和边界条件;分治法是已知问题的中间过程,再逐步将问题划分并求解。

二、Perm算法

1.全排列问题

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

全排列数:f(n)=n! (0!=1)

使用Perm算法解决全排列问题的代码如下:

template <class Type>
void Perm(Type list[],int k,int m){
    if(k==m){
        for(int i=0;i<=m;i++)
            cout<<list[i];
        cout<<endl;
    }
    else
    for(int i=k;i<=m;i++){
        Swap(list[k],list[i]);
        Perm(list,k+1,m);
        Swap(list[k],list[i]);
    }
}

template <class Type>
inline void Swap(Type &a,Type &b){
    Type temp=a;
    a=b;
    b=temp;
}

在排列一个长度为n的数组时,依次让每个元素成为数组的“头部”,对其他n-1个元素进行全排列,待排元素数为1时,直接输出结果。为了方便,设置参数k、m,令它们分别指向待排数组首尾,通过增减k、m移动指针。需要注意的是,每一次完成交换list[p]和list[i]的排序后,都需要把它们再次交换到原位后再进行下一次排列。

Perm算法时间复杂度为O(n!),在实际问题中,根据条件的不同全排列问题还有许多优化解法。

2.全排列问题的其他解法

(1)Johnson-Trotter算法

Johnson-Trotter算法并未提高代码运行的时间复杂度,但是它不需要将多余的遍历信息压栈,降低了空间复杂度。

Johnson-Trotter算法icon-default.png?t=N7T8http://【如何优雅地生成全排列——4分钟看懂【Johnson-Trotter全排列生成算法】】 https://www.bilibili.com/video/BV1XY411E7kz/?share_source=copy_web&vd_source=0cecc0fc0417017001dd525fe8051adb

(2)回溯算法解决全排列

leetcode相关例题的讲解非常清楚,附上链接以便后续学习。

回溯算法解决全排列_leetcodeicon-default.png?t=N7T8http://【46. 全排列 Permutations 【LeetCode 力扣官方题解】】 https://www.bilibili.com/video/BV1oa4y1v7Kz/?share_source=copy_web&vd_source=0cecc0fc0417017001dd525fe8051adb


总结

以上就是关于Perm算法解决全排列的所有内容。

Johnson-Trotter(JT)算法生成排列 对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列。假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n可能的位置中去,来得到较大规模大问题的一个解。按照这种方式生成的所有排列都是独一无二的,并且他们的总数应该是n(n-1)!=n!。这样,我们都得到了{1,……,n}的所有排列。 Johnso... 阅读详情

相关推荐

算法分析递归之集合的全排列问题

基于算法分析与设计——以大学生程序设计竞赛为例这本书中的第三章3.1.2集合的全排列问题 本题提出的问题是要解决n个元素的n!中排列方式,设R={r1,r2,···rn},令Ri=R-{ri}。集合的全排列记为perm(X), 则(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R...

weixin_40591181的博客 1470

算法学习之:全排列问题的递归算法(Perm)

【题目】 给出一个集合{1,2,3},求解该集合的全排列并打印。 全排列问题的递归算法(Perm) 【算法思想】 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R{ri}。 集合X中元素的全排列记为Perm(X)。 (ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀得到的排列。 R的全排列可归纳定义如下: 当n=1时,Perm(R)=(r),其中r是集合R中唯一的...

qq_42119136的博客 7930

CTF逆向实战:从SUCTF 2016看算法分析与识别技巧

在计算机安全领域,逆向工程是理解程序内部逻辑的关键技术,而算法分析则是其核心组成部分。算法作为计算机科学的基石,定义了数据处理的步骤与规则,其效率直接影响程序性能。通过分析代码中循环、分支与数据操作的模式,可以识别出排序、查找、加密等经典算法结构,这在CTF竞赛和软件安全审计中具有重要价值。例如,识别冒泡排序的双重循环特征或快速排序的分治结构,能帮助快速理解程序行为。掌握算法主定理等分析工具,还能进一步评估算法复杂度,发现潜在优化点或漏洞。本文结合SUCTF 2016等实战案例,探讨如何从汇编代码中还原算法

weixin_30851867的博客 344

算法分析课之Perm全排列函数

全排列算法及不重复显示数值优化(递归)

weixin_62717970的博客 1190

常用测试函数Perm测试函数

Perm函数是多自变量单目标函数,可以很好测试各种算法的全局收敛能力,既适合传统优化算法函数,也适合是测试智能启发式算法性能的,初学者者联系调试算法参数的一个入门级函数,有很好的实用性,大范围看,图像是一个漏斗形函数,人容易收敛,但是小范围看图像中间位置有一个小峰,最优值及近似最优值分布在峰的周围,优化的时候收敛方向首先向下寻优,然后是弧形走势,对应很多算法而言,需要不断调整,趋近最优解后,收敛路线比较狭窄,这个时候,如果算法参数设置的不合理,很容易在收敛路线左右震荡缓慢收敛,貌似简单并不简单的一个函数

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

Perm全排列算法

Perm全排列算法。

yz123127054的博客 1303

springboot源码 红色J_通达信副图指标源码之,出手就赢

今天跟大家分享一个通达信副图指标源码,本指标没有未来函数,因为本指标没有卖点提示,所以本指标需配合主图指标使用效果会更好,简单易懂,很容易明白,所以就不过多介绍使用方法了,以下是指标的贴图。风险提示!股市有风险买卖需谨慎,本指标只做参考建议,不做买卖交易结果,自己要对自己交易结果的盈亏负责,以下是指标的源码。VAR2:=REF(LOW,1);VAR3:=SMA(ABS(LOW-VAR2),3,1)...

weixin_39859909的博客 2847

php perm,算法,_quickperm全排列算法分析解释,算法 - phpStudy

quickperm全排列算法分析解释这个算法用来生成N个元素的可重复全排列。算法官网:http://www.quickperm.org/算法描述:The Counting QuickPerm Algorithm:let a[] represent an arbitrary list of objects to permutelet N equal the length of a[]create a...

weixin_29375125的博客 148

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 869

手把手教你:在openEuler 22.03上离线搞定OpenSSH 9.8升级(CentOS 7.9通用)

本文详细介绍了在openEuler 22.03和CentOS 7.9系统上离线升级OpenSSH 9.8的完整流程,包括准备工作、离线包获取、安装步骤、服务管理及回滚方案。特别针对无外网环境的企业服务器,提供安全可靠的离线升级解决方案,帮助运维人员有效提升系统安全性。

weixin_30682415的博客 192

Perm递归排列问题

总的来说,其思想就是以k为开始,m为结束,前0~(k-1)位作为前缀,主要处理后k~m位,然后从k+1位开始,与后面剩余位数依次交换,交换一次输出一次。先是11交换22交换23交换33输出,然后12交换22交换23交换33输出,再13交换22交换23交换33输出。关于算法设计与分析中的2-4是 有疑问的,原文的代码注释不完善,而这个链接的代码显然更方便理解。后三位记录为123,

milu_ELK的博客 390

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1352

c++ Perm递归全排列函数

程序源码 #include&lt;stdio.h&gt; #include&lt;Windows.h&gt; #include&lt;iostream&gt; using namespace std; void Perm(int* array, int size, int N) { if(N == size) { for(int i = 0; i &lt; s...

hi_baymax的博客 991

【软件系统架构】系列四:嵌入式技术

嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软硬件集成于一体的专用计算机系统。它需要满足功能、可靠性、成本、体积、功耗等方面的严格要求。 嵌入式系统一般由以下组成部分构成:

moton2017的博客 999

Cleo Synchronization接口任意文件读取漏洞CVE-2024-50623 附POC

微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发Cleo。

nnn2188185的博客 480

【算法导论06】递归算法-perm算法

06递归算法-perm算法 问题描述: 给定一个含有n个数字的序列,设计算法对该序列进行全排列。 思路分析: 对n个数字序列进行全排列,最简单的思考方式是将n个数字依次作为序列的开头,得到n个n维序列,并对每个序列的第2个数到第n个数字进行全排列,由此产生递归。 算法分析: 将数字序列存放于数组A[N]中,每次交换A[0]与Ai,然后对A[1]到A[n-1]序列进行全排列。为了方便,设置参数p,q,表示从p到q的全排列,则每次交换A[p]与A[i],并对剩下序列A[p+1]到A[q]进行全排列,即可完成一次

qq_37739859的博客 2180

第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门

vben5 快速入门。 Vben Admin 框架新出的版本V5.5.4,而之前的Vben Admin 2.x 目前已存档,仅进行重大问题修复。之前在2.x版本曾经简单完成了一版专栏文章,当时也是收获了一些好评和建议。本次决定在v5 版本基础上再完成一次前后端的搭建。希望大家继续多多支持。项目精简后,再次启动项目,执行 pnpm run dev点击登录,可以看到接口报错,现在前端请求的后端有报错,下一节处理这部分逻辑。

cuiwin的专栏 7066

关于全排列的递归算法(Ruby实现)

记录一下自己关于全排列的递归算法的感悟。

振爷啊的博客 837

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

算法分析与设计---排序

2010年冬天上课,老师留的作业要求课后上机实现排序的算法,现在一年半已经过去了。 #include using namespace std; #include #include #define random(x)(rand()%(x)) #define N 10000 class timer//单位ms { public: void s

Hello World 781

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

c++ 排列 算法

这个算法,弄头疼了 一上午还是对其中递归是抹零两可的。 论坛地址:http://topic.csdn.net/u/20091017/11/57e2123c-04f2-431d-be02-f3485fbb8b24.html 代码如下: // test1.cpp : Defines the entry point for the console application. // #...

技术代码资料库 67

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

算法分析--排列问题

算法分析–排列问题[排列问题] 问题描述:设R={r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为Perm(X)。(r1)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。

SingleThinker的博客 960

【scau算法分析设计】8594重复元素排列(c)

目录 一、 题目 Description 输入格式 输出格式 输入样例 输出样例 提示 二、 分析 无重复元素原代码:(参考书本P13) 有重复元素: 三、 代码 结果: 一、 题目 Description 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。 输入格式 第1行是.

weixin_51159944的博客 560

用递归的方法实现全排列

举例说明,排头为1时: Perm(1,4) : for j=1  to  4      j=1: P[1]与P[1]互换     1  2  3  4              Perm(2,4) : for j=2  to  4                    j=2: P[2]与P[2]互换 1  2  3  4                              Perm(3,4

算法之道 430

算法分析与设计3_递归

递归与分治策略 递归 任何一个可以用计算机求解的问题所需的计算时间都与其规模n有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题(1<k≤n),且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。 程序直接或间接调用自身的编程技巧称为递归算法 (Recur

weixin_44618388的博客 245

排列perm HYSBZ - 1072(状压dp/暴力)

Description   给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种。 Input   输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开。s保证只包含数字0, 1, 2, 3, 4, 5, 6, 7, 8, 9....

airen6935的博客 125
上一篇: 算法分析——合并排序和快速排序
下一篇: 算法分析——汉诺塔问题
Zephyr .
博客等级 码龄5年 29粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值