Python實現機器演算法 04 全排列

2021-09-18 02:45:15 字數 2217 閱讀 2792

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。公式:全排列數f(n)=n!(定義0!=1)

其實在python中,已經能通過python自帶的庫itertools.permutations 來實現,參考文件為

下面我們通過自行編寫**的方式,在python中實現全排列的演算法,最容易想到的就是遞迴的方式;並且可以通過兩種途徑來實現它,一種是大家常見的list序列方式,一種是使用yield 迭代方式

一、序列實現方式

def perm1(iter,iterlist=,iterlist_total=):

"""全排列函式

:param iter:需要全排列的序列

:param iterlist: 在遞迴中傳遞已經被排列的序列,初始不需要賦值

:param iterlist_total: 在遞迴中傳遞已經被全部被成功完成排列的序列,初始不需要賦值

:return:返回全排列的個數

原理是使用遞迴

ex:例如:

[1, 2, 3, 4, 5, 6]

先將1,取出來身剩下的元素組成的序列再次排列

然後在將2取出來,剩下的元素組成的序列(注意必須包含1,這點注意,不然元素個數越來越減少)再次排列

當遞迴到iter只有乙個的時候,遞迴停止

"""if len(iter)<=1:

iterlist=iterlist+iter

else:

for i,j in enumerate(iter):

"""這種寫法是典型的在list中,去掉當前索引為i的元素,得到其餘的元素組成的列表的寫法

可以用list(set(iter)-set([j]))這種寫法,但是轉換的過程中,會將iter重新排序,在

一些程式中不適用"""

perm1(iter[:i]+iter[i+1:],iterlist+[j],iterlist_total)

return iterlist_total

二、yield 迭代實現方式

def perm2(iter):

"""全排列函式,通過yield實現

:param iter:需要全排列的序列

:param iter:

:return:

注意:程式中有兩個yield出口

"""if len(iter)<=1:

yield iter

else:

for i, j in enumerate(iter):

"""這種寫法是典型的在list中,去掉當前索引為i的元素,得到其餘的元素組成的列表的寫法

可以用list(set(iter)-set([j]))這種寫法,但是轉換的過程中,會將iter重新排序,在

一些程式中不適用"""

for e in perm2(iter[:i] + iter[i + 1:]):

"""相當於,將剩下的元素進行全排列,因perm2是返回的是迭代物件,只能通過for將其乙個乙個的取出

來,然後和 上乙個 for 迴圈的 j 組成全排列"""

yield [j]+e

驗證一下

def main():

i=perm1([1,2,3])

for item in i:

print(item)

print("permutations count:{}".format(len(i)))

i=perm2([1,2,3])

for item in i:

print(item)

實現的結果如下:

[1, 2, 3]

[1, 3, 2]

[2, 1, 3]

[2, 3, 1]

[3, 1, 2]

[3, 2, 1]

permutations count:6

[1, 2, 3]

[1, 3, 2]

[2, 1, 3]

[2, 3, 1]

[3, 1, 2]

[3, 2, 1]

資料參考:

how to generate all permutations of a list in python

在stackoverflow上面介紹了n種實現方式

python使用遞迴解決全排列數字示例

雪花演算法(04)機器資訊

時間部分生成後,下一步是機器資訊,佔10位。我們這裡把機器資訊分成兩部分,一部分是資料中心id,佔5位,一部分是機器id,佔5位。這兩個id可以在部署專案的時候根據不同的機器自定義不同的id,這樣能人為的保障每個id都不同。比如 設定資料中心id為1 private static final lon...

雪花演算法(04)機器資訊

時間部分生成後,下一步是機器資訊,佔10位。我們這裡把機器資訊分成兩部分,一部分是資料中心id,佔5位,一部分是機器id,佔5位。這兩個id可以在部署專案的時候根據不同的機器自定義不同的id,這樣能人為的保障每個id都不同。比如 也可以根據自己機器的情況自動生成,不過有很小很小的風險會重複,這個風險...

雪花演算法(04)機器資訊

時間部分生成後,下一步是機器資訊,佔10位。我們這裡把機器資訊分成兩部分,一部分是資料中心id,佔5位,一部分是機器id,佔5位。這兩個id可以在部署專案的時候根據不同的機器自定義不同的id,這樣能人為的保障每個id都不同。比如 設定資料中心id為1 private static final lon...