全排列算法的理解

本文介绍了几种生成全排列的方法,包括序数法、字典序法及换位法,并详细阐述了通过换位法生成n!全排列的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)序数法:

   因为: (2)字典序法:

n!=((n-1)+1)(n-1)!=(n-1)(n-1)!+(n-1)!,

同理

(n-1)!=(n-2)(n-2)!+(n-2)!,

…,

n!= (n-1)(n-1)!+ (n-2)(n-2)!+…+2*2!+2!

不难证明0n!-1的任何数m可唯一的表示为 m=an-1(n-1)!+ an-2(n-2)!+…+a11!, 其中
0< ai< i.
 

   

 

 

生成给定全排列的下一个排列

所谓一个的下一个就是这一个

下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。

(3)换位法:

生成n!可以在生成(n-1)!的阶乘基础上,依次从最右端插入第n个数。

考虑{1,2…n}的一个排列,其上每一个整数都给了一个方向,我们称整数k是可移的(Mobile&Active),如果它的箭头所指的方向的邻点小于它本身。

 

于是,我们可由

按如下算法产生所有排列

算法

1开始时:

2,当存在可移数时

(a)找最大的可移数m
(b)m与其箭头所指的邻数互换位置
(c)将所得排列中比m大的数p的方向调整,即改为相反方向。

算法如下

            m=m1,          0  m ≤n!-1

      m1=2m2+k1,     0≤ k1 ≤1

      m2=3m3+ k2,     0≤ k2 ≤2

       …………….

           mn-2=(n-1)mn-1+ kn-2, 0≤ kn-2 ≤n-2

      mn-1= kn-1,         0≤ kn-1 ≤n-1

  (kn-1 k2k1) ←→ m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值