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

溫馨提示×

溫馨提示×

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

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

Python怎么通過內置函數和自寫算法DFS實現排列組合

發布時間:2023-05-04 16:33:57 來源:億速云 閱讀:99 作者:iii 欄目:開發技術

這篇文章主要介紹“Python怎么通過內置函數和自寫算法DFS實現排列組合”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python怎么通過內置函數和自寫算法DFS實現排列組合”文章能幫助大家解決問題。

排列組合是數學中的一種常見的計算方法,用于求出從給定的元素中選取若干個元素的所有可能的排列或組合。在Python中,有多種方式可以實現排列組合的計算。

調用內置函數

Python標準庫中提供了一個模塊itertools,該模塊包含了許多用于生成迭代器的工具函數,其中就有2個函數可以用于計算排列組合,分別是:

- permutations(p [, r]):從序列p中取出r個元素的組成全排列,組合得到元組作為新迭代器的元素。
- combinations(p, r):從序列p中取出r個元素組成全組合,元素不允許重復,組合得到元組作為新迭代器的元素。

這2個函數都返回一個迭代器對象,可以使用list()函數將其轉換為列表,或者使用for循環遍歷其元素。下面是一個簡單的例子:

對于1到n個數進行排列,使用內置函數permutations(iterable,r=None);

permutations(iterable,r=None) 連續返回iterable序列中的元素生成的長度為r的排列,如果r未指定或者為None,則默認值為iterable的長度。

from itertools import *
s = [1,2,3,4,5]
for element in permutations(s,2):
    a = "".join(str(element))
    print(a,end="")
out[1]:(1, 2)(1, 3)(1, 4)(1, 5)(2, 1)(2, 3)(2, 4)(2, 5)(3, 1)(3, 2)(3, 4)(3, 5)(4, 1)(4, 2)(4, 3)(4, 5)(5, 1)(5, 2)(5, 3)(5, 4)

如果需要枚舉的數少的情況,可以直接通過暴力法

for i in range(5):
    for j in range(5):
        if i!=j:
            print(s[i],s[j])

暴力法對于數字少的情況,效果好且簡單。

對于1到n個數進行組合,使用內置函數combinations(iterable,r=None)

In [30]: from itertools import *
s = {1,2,3,4}
for element in combinations(s,3):
    a = "".join(str(element))
    print(a,end="")
(1, 2, 3)(1, 2, 4)(1, 3, 4)(2, 3, 4)

自寫算法DFS實現

除了使用內置函數外,我們也可以自己編寫算法來實現排列組合的計算。一種常見的算法是使用深度優先搜索(DFS)來遍歷所有可能的情況,并將滿足條件的結果保存下來。下面是一個使用DFS實現全排列和全組合的例子:

a = [1,2,3,4,5]
def dfs(s,t):
    if s==2: 
        for i in range(0,2):
            print(a[i],end="")
        print(" ")
        return
    for i in range(s,t+1):
        a[s],a[i] = a[i],a[s]
        dfs(s+1,t)
        a[s],a[i] = a[i],a[s]
dfs(0,4)

 上述代碼雖然很短,但有個缺點就是不能從小到大輸出排列。

改進之后的代碼:實現從小到大輸出

a = [1,2,3,4,5]
b = [0] * 10
vis = [0] * 20
def dfs(s,t):
    if s==2:
        for i in range(0,2):
            print(b[i],end="")
        print(" ")
        return 
    for i in range(0,t):
        if not vis[i]:
            vis[i] = True
            b[s] = a[i]
            dfs(s+1,t)
            vis[i] = False
dfs(0,5)

自寫算法實現組合:

# 首先,我們定義一個函數dfs,它接受五個參數:
# - cur: 當前遍歷到的元素的下標,初始為0
# - m: 要選出的元素個數
# - cur_list: 保存當前已選出的元素的列表
# - original_list: 給定的n個元素的列表
# - result_list: 保存最終結果的列表
def dfs(cur, m, cur_list, original_list, result_list):
    # 如果已經選出了m個元素,就把當前列表添加到結果列表中,并返回
    if m == 0:
        result_list.append(list(cur_list))
        return
    # 如果還沒有選出m個元素,就從當前下標開始,遍歷原始列表中的每個元素
    for i in range(cur, len(original_list)):
        # 把當前元素添加到當前列表中
        cur_list.append(original_list[i])
        # 遞歸地調用dfs函數,更新下標和剩余元素個數
        dfs(i + 1, m - 1, cur_list, original_list, result_list)
        # 回溯時,把當前元素從當前列表中移除
        cur_list.pop()
# 然后,我們定義一個測試函數,給定一個原始列表和一個目標個數,調用dfs函數,并打印結果列表
def test(original_list, m):
    # 初始化結果列表為空列表
    result_list = []
    # 調用dfs函數,傳入初始下標為0,空的當前列表和結果列表
    dfs(0, m, [], original_list, result_list)
    # 打印結果列表
    print(result_list)
# 最后,我們用一個例子來測試一下我們的算法,假設原始列表為[1, 2, 3, 4],目標個數為2
test([1, 2, 3, 4], 3)
# 輸出結果為:
# [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
# 可以看到,我們的算法成功地找到了所有的組合,并用DFS的方式遍歷了它們。

關于“Python怎么通過內置函數和自寫算法DFS實現排列組合”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

土默特左旗| 安乡县| 平定县| 剑阁县| 陇川县| 余姚市| 嘉祥县| 石柱| 清水县| 剑阁县| 沁水县| 常州市| 宜黄县| 子长县| 栾川县| 金华市| 宜良县| 渭南市| 南江县| 桐乡市| 镇原县| 怀仁县| 大宁县| 金山区| 隆安县| 江油市| 固安县| 陈巴尔虎旗| 眉山市| 旺苍县| 江北区| 龙州县| 阳西县| 天全县| 万州区| 鄂托克前旗| 广南县| 华蓥市| 郎溪县| 龙游县| 洱源县|