演算法之 回溯演算法 詳解 python

2021-10-11 13:45:29 字數 3173 閱讀 1057

回溯演算法實際上**基於dfs(深度優先搜尋)**的乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回到上乙個狀態,嘗試其他的路徑,這種走不通就退回再走的技術為回溯法;滿足回溯條件的某個狀態的點稱為「回溯點」。

dfs 和回溯演算法區別

dfs 是乙個勁的往某乙個方向搜尋,直到到達最底層,而回溯演算法建立在 dfs 基礎之上的,但不同的是在搜尋過程中,達到結束條件後,恢復狀態,回溯上一層,再次搜尋。因此回溯演算法與 dfs 的區別就是有無狀態重置

何時使用回溯演算法

當問題碰到走不通的路徑,需要"回頭",以此來查詢出所有的解的時候,使用回溯演算法。即滿足結束條件或者發現不是正確路徑的時候(走不通),要撤銷選擇,回退到上乙個狀態,繼續嘗試,直到找出所有解為止。

回溯演算法的基本步驟

回溯演算法類的題型有哪些

注意:子集、組合是無關順序的,而排列是和元素順序有關的,如 [1,2] 和 [2,1] 是同乙個組合(子集),但 [1,2] 和 [2,1] 是兩種不一樣的排列!!!!

result =

defbacktrack

(路徑, 選擇列表)

:if 滿足結束條件:

result.add(路徑)

return

for 選擇 in 選擇列表:

做選擇backtrack(路徑, 選擇列表)

撤銷選擇

leetcode78.子集

問題描述

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

**說明:**解集不能包含重複的子集。

示例

輸入: nums = [1,2,3]

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

python**題解

套用上述回溯演算法的模板,path表示已選擇的路徑,for i in range(start, len(nums))表示當前能夠選擇的列表元素,注意對於組合類問題不能夠選擇前面已經選擇過的元素,因為會存在重複結果,因此必須有乙個start引數來控制每一輪能夠選擇的元素[start, len(nums)]

class

solution

:def

subsets

(self, nums: list[

int])-

> list[list[

int]]:

defbacktrack

(nums, path, start)

:# 將path新增到res結果中))

# 當前能夠選擇的引數列表

for i in

range

(start,

len(nums)):

# 做選擇

) backtrack(nums, path, i+1)

# 撤銷選擇

path.pop(

) res =

backtrack(nums,

,0)return res

leetcode77.組合

問題描述

給定兩個整數 n 和 k,返回 1 … n 中所有可能的 k 個數的組合。

示例

輸入: n = 4, k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

python**題解

本題與上一題基本相同,都是屬於組合類問題,只是遞迴的終止條件不同,本題的終止條件是當路徑長度為k時len(track) == k,將結果新增到res中。

套用上述回溯演算法的模板,track表示已選擇的路徑,for i in range(start, n+1)表示當前能夠選擇的列表元素,注意start是從1開始的,應為題目中指明能夠選擇的數為1...n

class

solution

:def

combine

(self, n:

int, k:

int)

-> list[list[

int]]:

# 數的選擇範圍在1-n

defbacktrack

(n,k,start,track):if

len(track)

== k:))

return

# 注意i從start開始遞增

for i in

range

(start, n+1)

:# 做選擇

backtrack(n,k,i+

1,track)

# 撤銷選擇

track.pop(

) res =

track =

backtrack(n,k,

1,track)

return res

通過上述講解,讀者應該對回溯演算法的概念以及模板套路有乙個基本的認識,回溯的關鍵在於選擇與撤銷選擇的過程,讀者可以仔細體會一下 ,相信一定會有所收穫。後續會繼續更新關於回溯演算法的相關題解,歡迎持續關注!

如果喜歡作者,歡迎點讚、收藏及關注,謝謝!

回溯演算法詳解(python

從本質上來說,回溯演算法就是深度優先搜尋 dfs 而且,回溯演算法和動態規劃也很像,它們都是 分而治之 的思想,但是動態規劃具有重疊子問題的特性,可以通過 dp table 優化,將遞迴樹大幅剪枝。而那些無法大幅剪枝,只能暴力求解的動態規劃就是回溯演算法了。對於回溯演算法來說,最重要的是 路徑 和 ...

演算法詳解之回溯法

理論輔助 回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為 1 定義乙個解空間,它包含問題的解。2 利用適於搜尋的方法組織解空間。3 利用深度優先法搜尋解空間。4 利用限界函式避免...

回溯演算法詳解

解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。相應的只是需要思考3個問題 路徑 也就是已經做出的選擇 選擇列表 也就是你當前可以做的選擇。結束條件 到達決策樹底層,無法再次繼續選擇的時候 result def backtrack 路徑,選擇列表 if 滿足結束條件 result.add 路徑 r...