问题
求包含n个不同元素的集合s=[x0,x1,x2,…,xn−1]的全排列,其中任意两元素互不相同。
解法
本文介绍Steinhaus-Johnson-Trotter算法求解集合的所有全排列。
(1) 初始化设集合为空s=[],其全排列只有1个:
[] (2) 在第(1)步基础上增加新元素x0,可插入的位置唯一,得到1个排列:
[x0] (3) 在第(2)步基础上增加新元素x1,可插入的位置有2个,得到2个排列:
[x0,x1][x1,x0] (4) 在第(3)步基础上增加新元素x2,可插入的位置都有3个,得到2×3=6个排列:
[x0,x1,x2][x0,x2,x1][x2,x1,x0][x1,x0,x2][x2,x0,x1][x1,x2,x0] 可以看出在第n步操作时新增元素xn−1,这时可以插入的位置有n个,设第n−1步插入后得到的排列数量为f(n−1),第n步插入后得到的排列数量为f(n)=f(n−1)×n。
由此可得包含n个元素的集合s=[x0,x1,…,xn−1]的全排列数量为
f(n)={1f(n−1)×nn=1n>1 求n个元素的全排列,需要重复n步找出所有排列,该算法的时间复杂度为O(n!)。
Steinhaus-Johnson-Trotter算法
LeetCode
源码
FullPermutation.h
FullPermutation.cpp
测试
FullPermutationTest.cpp