這篇文章將為大家詳細講解有關使用python怎么實現(xiàn)全排列,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡營銷推廣、網(wǎng)站重做改版、雞澤網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5建站、商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為雞澤等各大城市提供網(wǎng)站開發(fā)制作服務。從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。
公式:全排列數(shù)f(n)=n!(定義0!=1)
1 遞歸實現(xiàn)全排列(回溯思想)
1.1 思想
舉個例子,比如你要對a,b,c三個字符進行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab這六種可能就是當指針指向第一個元素a時,它可以是其本身a(即和自己進行交換),還可以和b,c進行交換,故有3種可能,當?shù)谝粋€元素a確定以后,指針移向第二位置,第二個位置可以和其本身b及其后的元素c進行交換,又可以形成兩種排列,當指針指向第三個元素c的時候,這個時候其后沒有元素了,此時,則確定了一組排列,輸出。但是每次輸出后要把數(shù)組恢復為原來的樣子。
1.2 python實現(xiàn)
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)實現(xiàn)全排列
2.1 思想
定義全排列問題:輸入一個長度為n的列表arr,輸出arr的全排列。
(1)首先可以確定的是,每一種全排列的結果中包含的列表長度均是n。想象面前有n個空盒子,現(xiàn)在要把這n個數(shù)放到這些空盒子里去,每個盒子只能放一個數(shù)。那么第一個盒子中可以放的選擇是n種,可以使用一個循環(huán)來逐個嘗試。
for index in range(0, len(arr)):
temp[position] = arr[index]
(2)第一個盒子放完后,就該往第二個盒子里放了。假設第一個盒子里放的是arr的第一個數(shù),那么第二個盒子就只能放第2~n個數(shù)了(不能重復)。為此引入visit列表用來標記arr中哪些數(shù)字被使用過了。初始化:
visit = [True, True, True, True]
這樣,當?shù)谝粋€位置已經(jīng)使用過時,就在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)當?shù)趉個盒子處理完畢后,處理下一個盒子直接調(diào)用dfs(k+1)即可,也就是遞歸調(diào)用。解決了當下該如何做,下一步也就知道怎么做了。
(4)遞歸調(diào)用的一定要注意的問題是遞歸調(diào)用的出口,否則循環(huán)調(diào)用下去程序會崩潰無法運行。在這個問題中什么時候結束遞歸調(diào)用呢?答案是當這n個盒子都放滿了,即處理到第n+1個盒子時結束調(diào)用,同時輸出此時的排列結果。
2.2 python實現(xiàn)
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)
注釋了“非常重要”的語句是不能省略的,省略后僅出現(xiàn)[1, 2, 3, 4]一條結果。dfs(k+1)前后的兩條語句分別稱之為試探和回溯。
3 combination和permutations函數(shù)的區(qū)別
permutations方法重在排列:
import itertools n=3 a=[str(i) for i in range(n)] s="" s=s.join(a) for i in itertools.permutations(s,n): print (''.join(i)) # 結果 012 021 102 120 201 210
combinations方法重在組合:
import itertools n=3 a=[str(i) for i in range(n)] s="" s=s.join(a) for i in itertools.combinations(s,n): print (''.join(i)) # 結果 012
關于“使用python怎么實現(xiàn)全排列”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁標題:使用python怎么實現(xiàn)全排列-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://jinyejixie.com/article42/ccsghc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、電子商務、網(wǎng)頁設計公司、關鍵詞優(yōu)化、網(wǎng)站排名、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容