排列的生成(三) —— 鄰位互換法

1. 定義

是由Johnson-Trotter首先提出。如果已知n-1個元素的排列,將n插入到排列的不同位置,就得到了n個元素的排列。也可以直覺地認爲,只要把排列中任意相鄰的兩個元素交換位置,就可以得到一個新的排列。

2. 算法

12341^\gets2^\gets3^\gets 4^\gets爲初始排列,剪頭所指一側,相鄰的數若比它小時,則稱該數處在活動狀態,12341^\gets2^\gets3^\gets 4^\gets的2,3,4都處於活動狀態。
p1p2pnp_1p_2\dots p_n生成下一個排列的步驟:

  • S1:p1p2pnp_1p_2\dots p_n沒有數處於活動狀態則結束。
  • S2: 將處於活動狀態的各數中值最大者設爲mm,則mm和它的剪頭所指一側相鄰的數互換位置,而且比mm大的所有數的剪頭改變方向,即\to改爲\gets\gets改爲\to,轉S1。

2.1 求排列1234的下一個排列

在這裏插入圖片描述

2.2 求排列12345生成的第100個排列數是多少

通過2.1可以看出每個數字經過多少次排列向左或向右(初始移動是向左)移動一位,如下表

數字 2 3 4 5
次數 60(3 ×4×5) 20(4×5) 5(1×5) 1

所以這100次排列當中,

  • 5排列了100次
  • 4排列了20次
  • 3排列了5次
  • 2排列了2次。

因爲總共有5位數,所以5每經過10次排列後會回到起點,4每經過8次排列後會回到起點,3經過6次排列後會回到起點,2不會回到起點,2最多隻能排列2次。因此
(1)100/10=10,餘數爲0,說明此時5在第5位。(考慮全部數字)—— _ _ _ _ 5
(2)20/8=2,餘數爲4,說明此時4在第1位。(不考慮數字5)—— 4 _ _ _ 5
(3)5/6=0,餘數爲5,說明此時3在第2位。(不考慮數字4,5)—— 4 _ 3 _ 5
(4)2排列了2次,此時的對應的兩位數是21。(不考慮數字3,4,5)—— 4 2 3 1 5
因此排列12345生成的第100個排列數是42315。

2.3 求 23541是排列12345生成的第幾個排列

12345生成的排列總共有5!=1205!=120個。
通過2.2分析知道
(1)不考慮345,序列21表明了2排列了2次(移動了1次)
(2)不考慮45,序列231表明3排列了5次(移動了4次)
(3)不考慮5,序列2341表明4排列了18次(移動了17次)
此時,根據2.2的表就可以猜了,5排列了至少max{1×60+1,4×20+1,17×5+1}=max{61,81,86}=86\max \{1\times 60+1,4\times20+1,17\times 5+1\}=\max\{61,81,86\}=86次剛好滿足上述要求,最後一個要求是要滿足5的位置,5處於第3位,86/10=6餘數是1,說明這是5還在第1位,增加1次排列即可讓5在第3位而又可以滿足(1)(2)(3)條件,此時可知88即爲最終所求。

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