排列的生成(二) —— 序數法

1. 定義

nn個元素的全排列有n!n!個,如果將排列按順序編號,並能夠按照某種方法建立起每一個序號與一個排列之間的對應關係,那麼就可以根據序號確定排列,反過來也可以根據排列確定它的序號。根據排列的序號生成對應排列的方法就稱爲序數法。
n!=n(n1)!=[(n1)+1](n1)!=(n1)(n1)!+(n1)! \begin{aligned} n ! &=n(n-1) !=[(n-1)+1](n-1) ! \\ &=(n-1)(n-1) !+(n-1) ! \end{aligned}
同理可得
(n1)!=(n2)(n2)!+(n2)! (n-1) !=(n-2)(n-2) !+(n-2) !
代入上式可得
n!=(n1)(n1)!+(n2)(n2)!+(n2)!=(n1)(n1)!+(n2)(n2)!+(n3)(n3)!++22!+2!=k=1n1kk!+1 \begin{aligned} n ! &=(n-1)(n-1) !+(n-2)(n-2) !+(n-2) ! \\ &=(n-1)(n-1) !+(n-2)(n-2) !+(n-3)(n-3) !+\cdots+2 \cdot 2 !+2 ! \\ &=\sum_{k=1}^{n-1} k \cdot k !+1 \end{aligned}
上式減1得
n!1=(n1)(n1)!+(n2)(n2)!++22!+11! n !-1=(n-1)(n-1) !+(n-2)(n-2) !+\cdots+2 \cdot 2 !+1 \cdot 1 !
可得到00n!1n!-1的整數m可以唯一地表示爲
m=ak1(k1)!+ak2(k2)!++a22!+a1 m=a_{k-1}(k-1) !+a_{k-2}(k-2) !+\cdots+a_{2} \cdot 2 !+a_{1}
其中aia_i滿足0aik,i=1,2, ,k10 \leqslant a_{i} \leqslant k, i=1,2, \cdots, k-1
所以可以證明00n!1n!-1n!n!個整數和序數(an1,an2, ,a2,a1)\left(a_{n-1}, a_{n-2}, \cdots, a_{2}, a_{1}\right)一一對應。

2. 序數法生成全排列算法

由排列P1P2P3PnP_1P_2P_3\dots P_n對應的序數(an1an2a1)(a_{n-1}a_{n-2}\dots a_1)的規則爲:
aia_i = i+1i+1的右邊比i+1i+1小的數字的個數

  • 例1:由排列數確定排列的序號
    以1,2,3,4的排列4213爲例,排列4213爲例,排列4213,4的右邊比它小的數有3位,故a3=3a_3=3;3的右邊比3小的數爲0,故a2=0a_2=0,2的右方比2小的數爲1,故a1=1a_1=1,故排列4213對應的序數爲(301)。

  • 例2:由排列的序號確定排列數
    承接上一個例子,a3=3a_3 = 3,故4在排列中所在的位右方小的數有3個,故在排列數中的第一位爲4。a2=0a_2=0,故3的右方沒有比它小的,故在排列數中的第四位上,以此類推,得到最終的排列數爲4213。

  • 例3:n=4n=4的序數(a3a2a1)(a_3a_2a_1)與對應的排列
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章