4.1 排列组合问题
排列问题
1 排列问题-分治法、递归法
问题描述
R是由n个元素构成的序列集合,R={r1, r2, … ,rn},求R的全排列perm(R)。
问题分析
- 若R中只有1个元素{r},则perm(R)=(r)
- 若R中只有2个元素{r1, r2},则
perm(R)=(r1)perm(R1)∪(r2)perm(R2)
其中,Ri=R-{ri} - 若R中有3个元素{ r1, r2, r3},则
perm(R)=(r1)perm(R1)∪(r2)perm(R2)∪(r3)perm(R3)
策略选择
- 算法思想:分治法
算法设计
- 划分:依次将待排列的数组的后n-1个元素与第一个元素交换。
- 解决:则每次递归处理的都是后n-1个元素的全排列。
- 合并:当数组元素仅有一个时为此递归算法的出口。即开始合并。
1 | 算法 perm(Type list[], int k, int m) |
算法分析
$$
T(n)=\begin{cases}
O(1)& n=1\
nT(n-1)+O(1)& n>1
\end{cases}
$$
2 排列问题-Johnson-Trotter Algorithm
算法原理
给一个排列中的每个分量k 赋予一个方向。例如:
$$
\overrightarrow{3}\overleftarrow{2}\overrightarrow{4}\overleftarrow{1}
$$
如果分量k 的箭头指向一个相邻的较小元素,我们说它在这个以箭头标记的排列中是可移动的。3和4是可移动的。
算法过程
1 | JohnsonTrotter(n) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!









