Python 非遞迴方法的全排列

2021-08-15 05:21:45 字數 2582 閱讀 8800

pythonalgorithm

排列(英語:permutation)是將相異物件或符號根據確定的順序重排。每個順序都稱作乙個排列。例如,從一到六的數字有720種排列,對應於由這些數字組成的所有不重複亦不闕漏的序列,例如4, 5, 6, 1, 2, 3 與1, 3, 5, 2, 4, 6。【from wikipedia】

從n個相異元素中取出 k個元素,k個元素的排列數量為:

p kn

=n!(

n−k)

!^=}}

pkn​=(

n−k)

!n!​

其中p意為permutation(排列),!表示階乘運算。全排列而取k為n,則結果為n!。

字典序法

字典序,就是將元素按照字典的順序(a-z, 1-9)進行排列。以字典的順序作為比較的依據,可以比較出兩個串的大小。比如 「1」 < 「13」<「14」<「153」, 就是按每個數字位逐個比較的結果。對於乙個串「123456789」, 可以知道最小的串是「123456789」,而最大的串「987654321」。這樣針對這個串以字典序法生成全排列生成全排列,就是依次生成「123456789」->「123456798」->…->「987654312」->"987654321"這樣的串。字典序法要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。

鄰位對換法

該演算法由johnson-trotter首先提出,是乙個能快速生成全排列的演算法。它的下乙個全排列總是上乙個全排列對換某相鄰兩位得到的。如果已知n-1個元素的排列,將n插入到排列的不同位置,就得到了n個元素的排列。用這種方法可以產生出任意n個元素的排列。這個方法有乙個缺點:為了產生n個元素的排列,我們必須知道並儲存所有n-1個元素的排列,然後才能產生出所有n階排列。

遞增進製制法

這個演算法是基於序列的遞增進製數[3]。遞增進製數是指數字的進製隨著位數的遞增而遞增。一般情況下,數字最右邊的進製是2,次右邊的進製是3,以此類推。n位遞增進製數一共包含n!個數字,所以它可以與全排列生成演算法結合在一起。

遞減進製制法

字典序法

非遞迴演算法

設p是集合的乙個全排列:p=p1p2……pj-1pjpj+1……pn(1≤p1,p2,……,pn≤n-1)

1.從排列的右端開始,找出第乙個比右邊數字小的數字的序號j,即j=max在pj的右邊的數字中,

找出所有比pj大的數字中最小的數字pk,即k=min

2.交換pi,pk

3.再將排列右端的遞減部分pj+1pj+2……pn倒轉,因為j右端的數字是降序,所以只需要其左邊和右邊的交換,直到中間,因此可以得到乙個新的排列p』=p1p2……pj-1pkpn……pj+2pj+1

**

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""@author: gsharp

"""def

swap

(n,a,b)

: n[a]

,n[b]

= n[b]

,n[a]

return

none

defreverse

(n,begin):if

len(n)

> begin:

i = begin

j =len(n)-1

while i < j:

swap(n,i,j)

i +=

1 j -=

1return n

deffindmin

(n,i)

: j =

len(n)-1

k = i +

1while j > i:

if n[j]

> n[i]

and n[j]

< n[k]

: k = j

j -=

1return k

defpermut

(n):

count =

0 j =

len(n)-1

if j <1:

return n

else

:print n

count +=

1while j >=1:

i = j -

1if n[i]

< n [j]

: k = findmin(n,i)

swap (n,i,k)

reverse (n,j)

j =len(n)-1

count +=

1print n

else

: j -=

1print count

n =[1,

2,3,

4,5,

6]permut(n)

注意:

這裡只能對於具有可比較值的列表排序,對於如【『~』,』!』,』@』,』#』】無法直接排序。

初始序列必須為最小序列,否則無法列出全部排列。可先使用快速排序來排序後作為輸入。

python非遞迴全排列實現方法

剛剛開始學習python,當前看到了函式這一節。結合陣列操作,寫了個非遞迴的全排列生成。原理是插入法,也就是在乙個有n個元素的已有排列中,後加入的元素,依次在前,中,後的每乙個位置插入,生成n 1個新的全排列。因為python切割陣列或者字串,以及合併比較方便,所以,程式會節省很多 def geta...

python非遞迴全排列

剛剛開始學習python,按照廖雪峰的 看的,當前看到了函式這一節。結合陣列操作,寫了個非遞迴的全排列生成。原理是插入法,也就是在乙個有n個元素的已有排列中,後加入的元素,依次在前,中,後的每乙個位置插入,生成n 1個新的全排列。因為python切割陣列或者字串,以及合併比較方便,所以,程式會節省很...

全排列 非遞迴

description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...