從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...