生成排列

生成集合$\{1,2,\ldots,n\}$的所有排列。
地面装置尺寸$n$ (最多20)
算法
输出格式
输出  编号绘图

对象信息

A类置换一个$n$-元素对象集是这些对象的线性顺序,即一些对象放在第一个位置,另一个放在第二个位置,等等。为了简单起见,我们将置换看作集合$[n]:=\{1,2,\ldots,n\}$上的双射。这样的双射$\pi:[n]\rightarrow[n]$可以用许多不同的方式表示。我们使用单行符号$\pi=(\pi(1),\pi。例如,$[3]=\{1,2,3\}$的所有排列都是$1231322132312321$。

下图说明了此网站上运行的所有十一个算法的输出,用于生成$[4]=\{1,2,3,4\}$的所有排列,其中1=红色,2=黄色,3=绿色,4=蓝色。

莱克斯科尔克斯扎克威尔斯嘴唇10嘴唇16SJT公司埃尔德尔SiT公司SiTGC公司软件Corb公司

前十二个算法是约尔格·阿恩特的FXT库的一部分。字典排序算法在Knuth的书中解释为算法L【第7.2.1.2节,Knu11】。Zaks[Zak84]发现了通过反转前缀生成排列的算法。在换位排序中,任何两个连续置换在置换的两个条目的交换中是不同的。Wells[Wel61]、Heap[Hea63]和Lipski[Lip79]以更一般的形式描述了这种通过转位的排序。FXT库中提供了一些Lipski的算法,其中两个算法正在该网站上运行(除了Wells和Heap的算法,这是Lipski算法的特例;参见[Arn10])。所有的Lipski排序,特别是Wells和Heap排序,都具有相同后缀的排列连续出现的性质。通过相邻换位生成置换的算法也称为Steinhaus-Johnson-Trotter算法[Ste64,Joh63,Tro62]或“普通变换”。在Knuth的书[Knu11]中,它被描述为算法P。使用星形转置的算法总是将置换的第一个元素与其他元素交换。它是由Gideon Ehrlich发现的,在Knuth的书[Knu11]中被描述为算法E。在错位顺序中,没有两个连续排列在同一位置有任何元素。Savage的调查[Sav97]中描述了该算法。在排列的单轨排序中,排列列表中的每一列都是第一列的循环移位。在单轨Gray码排序中,除了前面的属性外,任何两个连续排列最多只能有两个换位(奇数$n$只有一个换位)。这两种算法在Arndt的FXT库文档[Arn10]中进行了描述。通过循环排列排列,可以很好地看到这两种排序的单轨特性,从而产生一个轮子,其中任何两个圆形轨道的区别仅在于旋转(左:单轨排序,右:单轨格雷码排序)。

每个步骤中倒数第二个算法要么交换排列的前两个条目,要么将整个排列向左旋转。Knuth的书[第7.2.1.2节中的问题71,Knu11]中提出了是否存在针对所有$n$的此类列表,并且Sawada和Williams在论文中描述了解决方案[SW18]。每个步骤中的最后一个算法将置换的前缀向左旋转一个位置,Corbett[Cor92]在一篇论文中对此进行了描述。

置换由以下公式推广多集合置换彩色排列,在这些部分中可以找到更多生成它们的算法。

枚举(OEIS)

$n$-元素集的排列数为$n!$,哪个是OEIS A000142公司.

下载源代码

[压缩C++源代码(GNU GPL)]
[链接到约尔格·阿恩特的FXT库(GNU GPL)]

工具书类