幾種排列生成算法的數學原理解析

對於有限數列:

1,2,3,...,n

易知其共有 n! 個不同的排列。爲了在枚舉這些排列時不遺漏,需要定義一種遍歷規則,這種遍歷規則便稱爲計數法。

 

計數法可分爲兩類:樹圖法、逆序法。


中介數:

中介數記錄了一個排列的全部信息,根據中介數可以確定的寫出一個排列,一個排列也對應一個獨特的中介數。通過中介數的順序遍歷(+1)便可不遺漏地得到所有的排列。

因爲一個的數字的排列方式是唯一確定的,不需要中介數。故n個數的排列對應的中介數只有n-1位。


樹圖法


字典序法

中介數中的第i個數c1表示對應的排列中的第i個數字應該從剩下的數中取第i個(由小到大排序,從0開始編號)。如:

中介數:201

c1=2 表示排列的第一個數應取1,2,3,4中的3;

c2=0 表示排列的第二個數應取1,2,4中的1;

c3=1 表示排列的第三個數應取2,4中的4;

故中介數201對應的排列爲3142;

 

中位數數位

c1

c2

c3

進制

4

3

2

位權

3*2

2

1

 


鄰位對換法:

中介數的第i位決定了第i+1個數字在排列中的位置。中介數的該位對應的子樹在此層排序的奇偶性決定了第i+1個數字插入原序列的方向。例:

中介數:102

初始數列:1

c1=1 表示排列中數字2應該插入當前數列“從後向前數”(默認方向)的1號空擋;

當前數列:21

c2=0 表示排列中數字3應該插入當前數列“從前向後數”(因爲 c1=1 爲奇數)的0號空擋;

當前數列:321

c3=2 表示排列中數字4應該插入當前數列“從前向後數”(因爲 (c1c2)=1*3+0=3爲奇數)的2號空擋;

當前數列:3241

 

中位數數位

c1

c2

c3

進制

2

3

4

位權

3*4

4

1

 


逆序法:


逆序:以遞增數列作爲參照對象(逆序爲0),一個數列中若出現後面的數小於前面的數,則該數列的逆序數+1。如

1234的逆序數爲1(逆序對:32)

4312的逆序數爲5(逆序對:43,41,42,31,32)

對於數列

 

注意到,n在排列中的逆序數最多爲n-1;n-1在排列中的逆序數最多爲n-2;······;1在排列中的逆序數最多爲0

故將2至n共n-1個數字的逆序數記錄下來拼成一箇中介數時,該中介數各個位的取值範圍不同,即各位有不同的進制。由此產生了兩種中介數組織方式:由低位到高位進制遞增的稱爲“遞增進位制數法”;由低位到高位進制遞減的稱爲“遞減進位制數法”。


遞增進位制數法:

中介數的高位指示了待排數字中較大數的逆序數。例如:

中介數:201

c1=2 表示待排數字4的逆序數爲2,故排列爲X4XX;

c2=0 表示待排數字3的逆序數爲0,故排列爲X4X3;

c3=1 表示待排數字2的逆序數爲2,故排列爲24X3;

最終得排列2413

 

中位數數位

c1

c2

c3

進制

4

3

2

位權

3*2

2

1

 


遞減進位制數法:

中介數的低位指示了待排數字中較大數的逆序數。例如:

中介數:102

c3=2 表示待排數字4的逆序數爲2,故排列爲X4XX;

c2=0 表示待排數字3的逆序數爲0,故排列爲X4X3;

c1=1 表示待排數字2的逆序數爲2,故排列爲24X3;

最終得排列2413

 

中位數數位

c1

c2

c3

進制

2

3

4

位權

3*4

4

1

 


                                                   

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