如何理解 Johnson Trotter 演算法來生成全排列?

時間 2021-05-12 07:31:30

1樓:Frank-D

先佔坑. 之前處理Mesh(頂點關係)的時候接觸過.

首先是直觀地思想說明(不難):

每次讓其中的「可移動元素」交換一下.

如何定義可移動元素?

每個數都有移動方向 (不是一成不變的),如果該數的方向指向的相鄰數比該數小的話則稱該數是可移動數

如何移動?

一開始為每乙個數字指定乙個方向(這個方向不是一成不變的): 但是一開始都指定乙個統一的方向: 比如都是左.

按照當前的方向移動最大的可移動項(下面例子是4),直到不能移動: 1. 已經到頭了; 2.

自己所指方向的數字比自己大. 同時, 找到所有元素中大於該當前元素的元素,反轉其移動方向.

1 2 3 4 (一開始最大的可移動數是4)

1 2 4 3 (4左移後的結果)

1 4 2 3 (4左移後的結果)

4 1 2 3 (4左移後的結果)

4 1 3 2 (3左移後的結果, 此時發現4是大於3的,反轉其方向. 發現最大可移動數是4)

1 4 3 2 (4右移後的結果)

1 3 4 2 (4右移後的結果)

1 3 2 4 (4右移後的結果)

3 1 2 4 (3左移後的結果, 此時發現4是大於3的, 反轉其方向. 發現最大可移動數是4)

3 1 4 2 (4左移後的結果)

3 4 1 2 (4左移後的結果)

4 3 1 2 (4左移後的結果, 此時3是動不了的, 因為4大於3, 最大可以動的數字是2)

4 3 2 1 (2左移後的結果, 此時發現3,4大於2, 反轉他們方向. 發現最大可移動數是4)

3 4 2 1 (4右移後的結果)

3 2 4 1 (4右移後的結果)

3 2 1 4 (4右移後的結果, 此時發現可移動數字只有3, 注意:剛才2把3,4的方向都調整為向右了)

2 3 1 4 (3右移後的結果, 此時發現4是大於3的, 反轉其方向.發現最大可移動數是4)

2 3 4 1 (4左移後的結果)

2 4 3 1 (4左移後的結果)

4 2 3 1 (4左移後的結果, 此時發現可以移動的數字只有3, 注意此時3依然是向右)

4 2 1 3 (3右移後的結果, 此時發現4是大於3的, 反轉其方向.發現最大可移動數是4)

2 4 1 3 (4右移後的結果)

2 1 4 3 (4右移後的結果)

2 1 3 4 (4右移後的結果, 此時四個數字的朝向分別是: 左左右右 -> 無法再進行移動演算法結束.)

(打字有點混亂, 供各位大佬批評.

2樓:

Johnson-Trotter演算法思想說到底還是向 個數的排列中插入第 個數

對於 個數的全排列,最大的那個數每次都會在剩下 個數不變的情況下從左到右或者從右到左逐位移動直到邊界,然後剩下 個數中的乙個進行一次移動後最大數繼續移動。

顯然當我們對最大數忽略不計時,剩下 個數的移動也就相當於 個數的全排列。

以此類推,當只有乙個數的時候顯然結果就是乙個數的全排列。

故而如此操作能生成全排列。

如何理解 TCP IP, SPDY, WebSocket 三者之間的關係?

龍騰道默默地 TCP是基於IP IP是一種協議,不是IP位址 實現的,HTTP 1.1 SPDY WebSocket HTTP2.0是基於TCP實現的。IP 乙個底層網路定址協議。TCP 乙個相對可靠確保資訊送達 且按順序送達的中層資訊傳輸協議,效能相對於UDP較差。HTTP 1.1 上層網頁資訊傳...

如何理解functional programming裡的currying與partial application

李欣宜 定義乙個多參函式f arg1,arg2 argn 時,如果每個引數argi的型別為ti,這個多參函式最後的返回結果的型別為rtype,那麼可以說f的型別為 t1 t2 tn rtype 這是很多語言對於多參函式的解釋,把這些引數作為乙個tuple或者list傳入,即 t1 t2 tn 型別的...

如何理解 It make A one of Canada s most popular cities to live in ?

加拿大公共健康 這個語法有問題。It makes.A stands for a city s name. 首先,絕對是It makes.然後,回答題主的問題 1 正解 2 最高端要求有範圍的限定,所以平時一般看到的最高端都加定冠詞。但是Canada s已經是個範圍的限定,就不需要了,再舉幾個例子 o...