亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

python實現全排列代碼(回溯、深度優(yōu)先搜索)

瀏覽:97日期:2022-08-06 08:40:29

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。

公式:全排列數f(n)=n!(定義0!=1)

1 遞歸實現全排列(回溯思想)

1.1 思想

舉個例子,比如你要對a,b,c三個字符進行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab這六種可能就是當指針指向第一個元素a時,它可以是其本身a(即和自己進行交換),還可以和b,c進行交換,故有3種可能,當第一個元素a確定以后,指針移向第二位置,第二個位置可以和其本身b及其后的元素c進行交換,又可以形成兩種排列,當指針指向第三個元素c的時候,這個時候其后沒有元素了,此時,則確定了一組排列,輸出。但是每次輸出后要把數組恢復為原來的樣子。

python實現全排列代碼(回溯、深度優(yōu)先搜索)

1.2 python實現

def permutations(arr, position, end): if position == end: print(arr) else: for index in range(position, end): arr[index], arr[position] = arr[position], arr[index] permutations(arr, position + 1, end) arr[index], arr[position] = arr[position], arr[index] # 還原到交換前的狀態(tài),為了進行下一次交換 arr = [1, 2, 3, 4]permutations(arr, 0, len(arr))

2 深度優(yōu)先搜索(DFS)實現全排列

2.1 思想

定義全排列問題:輸入一個長度為n的列表arr,輸出arr的全排列。

(1)首先可以確定的是,每一種全排列的結果中包含的列表長度均是n。想象面前有n個空盒子,現在要把這n個數放到這些空盒子里去,每個盒子只能放一個數。那么第一個盒子中可以放的選擇是n種,可以使用一個循環(huán)來逐個嘗試。

for index in range(0, len(arr)):temp[position] = arr[index]

(2)第一個盒子放完后,就該往第二個盒子里放了。假設第一個盒子里放的是arr的第一個數,那么第二個盒子就只能放第2~n個數了(不能重復)。為此引入visit列表用來標記arr中哪些數字被使用過了。初始化:

visit = [True, True, True, True]

這樣,當第一個位置已經使用過時,就在visit里做標記:visit = [False, True, True, True]

因此放第一個盒子的代碼可以改寫如下:

for index in range(0, len(arr)): if visit[index] == True: temp[position] = arr[index] visit[index] = False

(3)當第k個盒子處理完畢后,處理下一個盒子直接調用dfs(k+1)即可,也就是遞歸調用。解決了當下該如何做,下一步也就知道怎么做了。

(4)遞歸調用的一定要注意的問題是遞歸調用的出口,否則循環(huán)調用下去程序會崩潰無法運行。在這個問題中什么時候結束遞歸調用呢?答案是當這n個盒子都放滿了,即處理到第n+1個盒子時結束調用,同時輸出此時的排列結果。

2.2 python實現

visit = [True, True, True, True]temp = ['' for x in range(0, 4)] def dfs(position): # 遞歸出口 if position == len(arr): print(temp) return # 遞歸主體 for index in range(0, len(arr)): if visit[index] == True: temp[position] = arr[index] visit[index] = False # 試探 dfs(position + 1) visit[index] = True # 回溯。非常重要 arr = [1, 2, 3, 4]dfs(0)

注釋了“非常重要”的語句是不能省略的,省略后僅出現[1, 2, 3, 4]一條結果。dfs(k+1)前后的兩條語句分別稱之為試探和回溯。

3 combination和permutations函數的區(qū)別

permutations方法重在排列:

import itertoolsn=3a=[str(i) for i in range(n)]s=''s=s.join(a)for i in itertools.permutations(s,n): print (’’.join(i)) # 結果 012021102120201210

combinations方法重在組合:

import itertoolsn=3a=[str(i) for i in range(n)]s=''s=s.join(a)for i in itertools.combinations(s,n): print (’’.join(i)) # 結果 012

以上這篇python實現全排列代碼(回溯、深度優(yōu)先搜索)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 97精品国产福利一区二区三区 | 尤物国产视频 | 亚洲国产成人综合精品2020 | 激情综合网五月激情 | 日韩a级片在线观看 | 日韩免费无砖专区2020狼 | 小明视频免费永久在线网 | 免费一级性片 | 欧美日本一道免费一区三区 | 国产人成77777视频网站 | 亚洲自偷精品视频自拍 | 一级欧美日韩 | 亚洲国产精品久久人人爱 | 久热香蕉视频 | 欧美三茎同入 | 日韩欧美第一区二区三区 | 国产精品白浆精子流水合集 | 日韩中文字幕免费观看 | 一级黄色片毛片 | 国产精品福利午夜在线观看 | 欧美性大片免费 | 日韩亚洲在线观看 | 久久精品a | 亚洲欧美日本欧美在线播放污 | 国产精品久久国产精品99 | 国产特一级毛片 | 亚洲乱码国产一区网址 | 久久久日本精品一区二区三区 | 久久青青草原精品国产不卡 | 中国wwwxxx| 美国一级毛片免费看成人 | 免费精品国产 | 色黄网站成年女人色毛片 | 欧美亚洲国产精品久久蜜芽 | 久久久精品久久久久久 | 国产精品久久久久久影视 | 哪有黄色网址 | 极品国产一区二区三区 | 国产日韩第一页 | 好爽快一点视频在线观看 | 91视频啊啊啊 |