FullPermutation 全排列

问题

求包含nn个不同元素的集合s=[x0,x1,x2,,xn1]s = [x_0, x_1, x_2, \dots, x_{n-1} ]的全排列,其中任意两元素互不相同。

解法

本文介绍Steinhaus-Johnson-Trotter算法求解集合的所有全排列。

(1)(1) 初始化设集合为空s=[]s = [],其全排列只有11个:

[]\begin{matrix} [] \end{matrix}

(2)(2) 在第(1)(1)步基础上增加新元素x0x_0,可插入的位置唯一,得到11个排列:

[x0]\begin{matrix} [x_0] \\ \end{matrix}

(3)(3) 在第(2)(2)步基础上增加新元素x1x_1,可插入的位置有22个,得到22个排列:

[x0,x1][x1,x0]\begin{matrix} [x_0, x_1] \\ [x_1, x_0] \end{matrix}

(4)(4) 在第(3)(3)步基础上增加新元素x2x_2,可插入的位置都有33个,得到2×3=62 \times 3 = 6个排列:

[x0,x1,x2][x0,x2,x1][x2,x1,x0][x1,x0,x2][x2,x0,x1][x1,x2,x0]\begin{matrix} [x_0, x_1, x_2] \\ [x_0, x_2, x_1] \\ [x_2, x_1, x_0] \\ [x_1, x_0, x_2] \\ [x_2, x_0, x_1] \\ [x_1, x_2, x_0] \end{matrix}

可以看出在第nn步操作时新增元素xn1x_{n-1},这时可以插入的位置有nn个,设第n1n - 1步插入后得到的排列数量为f(n1)f(n-1),第nn步插入后得到的排列数量为f(n)=f(n1)×nf(n) = f(n-1) \times n

由此可得包含nn个元素的集合s=[x0,x1,,xn1]s = [x_0, x_1, \dots, x_{n-1}]的全排列数量为

f(n)={1n=1f(n1)×nn>1f(n) = \begin{cases} 1 & n = 1 \\ f(n-1) \times n & n \gt 1 \end{cases}

nn个元素的全排列,需要重复nn步找出所有排列,该算法的时间复杂度为O(n!)O(n!)

Steinhaus-Johnson-Trotter算法

LeetCode

源码

FullPermutation.h

FullPermutation.cpp

测试

FullPermutationTest.cpp

Last updated