中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python怎么實現全排列

發布時間:2021-03-23 12:41:06 來源:億速云 閱讀:2732 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關使用python怎么實現全排列,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

從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怎么實現全排列

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] # 還原到交換前的狀態,為了進行下一次交換
 
 
arr = [1, 2, 3, 4]
permutations(arr, 0, len(arr))

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

2.1 思想

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

(1)首先可以確定的是,每一種全排列的結果中包含的列表長度均是n。想象面前有n個空盒子,現在要把這n個數放到這些空盒子里去,每個盒子只能放一個數。那么第一個盒子中可以放的選擇是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)遞歸調用的一定要注意的問題是遞歸調用的出口,否則循環調用下去程序會崩潰無法運行。在這個問題中什么時候結束遞歸調用呢?答案是當這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函數的區別

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怎么實現全排列”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建湖县| 旌德县| 忻城县| 永新县| 鹰潭市| 桓台县| 温州市| 且末县| 承德市| 衢州市| 红河县| 高青县| 曲靖市| 台州市| 崇仁县| 贡嘎县| 海林市| 古蔺县| 星座| 任丘市| 玛多县| 庆安县| 六盘水市| 南阳市| 同仁县| 富顺县| 荣昌县| 健康| 乌恰县| 伊宁县| 临潭县| 吉木乃县| 彭阳县| 德昌县| 德清县| 河北省| 满城县| 卢氏县| 柯坪县| 咸丰县| 乐陵市|