全排列算法解析

全排列算法解析对一个串 abc 它的全排列是 abc acb bac bca cab cba 那当元素个数大于 1 时 我们可以设 Ei 表示集体 E 移除元素 i 之后的的集合 对集体 E a b c 来说 其全排列可表示成 a permutate b

欢迎大家来到IT世界,在知识的湖畔探索吧!

对一个串abc, 它的全排列是:

abc, acb, bac, bca, cab, cba

共有3X2 = 6种。如何从代码层面实现这样的功能呢?设permutate(E)表示E的一个全排列,对abc来说,它的全排列可以表示成:

permutate({a, b, c}) = {a+permutate({b, c}), b + permutate({a, c}), c + permutate({a, b})}

permutate({b, c}) = {b + permutate({c}, c + permutate({b}))}

以此类推。可以看到子问题和主问题是同样的模式,这时,我们的脑海里应该闪现出递归这两个字。是的,递归是解决这个问题的好办法。说到递归,我们就要解决两个问题;一个是递归的base,也就是最基本的操作问题,第二个是规模减小的问题,因为递归总是将大问题变成同样的小问题,至到base。对全排列来说,base就是只剩一个元素的时候,

permutate({b}) = b

permutate({c}) = c

一个元素的全排列是它本身,没毛病。那当元素个数大于1时,我们可以设Ei表示集体E移除元素i之后的的集合,对集体E={a b c}来说, 其全排列可表示成:

a+permutate(Ea), b + permutate(Eb), c + permutate(Ec)

可以看到,需要将每个元素作为前缀,然后,对除该元素之外的其它元素进行全排列, 在这个过程中,集合的size会不断变小直至为1,perfect!

那么,伪代码思路应该是

permutate(T list[], size) {

if size == 1 then return list[0]

else {

for i from 0 to size – 1 do

{

swap(list[0], list[i])

permutate(list + 1, size -1)

swap(list[0], list[i])

}

}

}

思路是这样,没毛病。细节上会不会有问题呢?好像是有的,上面的伪代码中, permutate(list + 1, size -1)这儿有点小问题,那就是子问题不知道自己的前缀是什么,怎么办?有几种办法,一种是用全局的东西来记住前缀,另一种是传递位置变量进去。这儿选用第二种方法。至此,算法的思维流程已完,开始C++代码表演。

全排列算法解析



欢迎大家来到IT世界,在知识的湖畔探索吧!

运行结果如下

全排列算法解析

看起来很6,mission completed!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/142337.html

(0)
上一篇 7分钟前
下一篇 2025年 8月 7日 下午4:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信