回溯演算法的原理和實現步驟

2021-10-06 20:45:25 字數 3384 閱讀 6933

回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法。

也就是說解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。在這個過程中只需要思考三個問題:

(1)路徑:也就是已經做出的選擇;

(2)選擇列表:也就是你當前可以做的選擇;

(3)結束條件:也就是1到達決策樹底層,無法再做選擇的條件

回溯演算法框架:

result =

defbacktrack

(路徑, 選擇列表)

:if 滿足結束條件:

result.add(路徑)

return

for 選擇 in 選擇列表:

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

撤銷選擇

核心是for迴圈裡面的遞迴,在遞迴呼叫之前做選擇,在遞迴呼叫之後撤銷選擇。

leetcode演算法題庫裡面的39題:

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。

# 剪枝操作,優化**

break

) self.backtrack(res, candidates, residue, path, size)

path.pop(

)if __name__ ==

'__main__'

: candidates =[2

,3,6

,7] target =

7 solution = solution(

) result = solution.combinationsum(candidates, target)

print

(result)

結果:

[[2

,2,3

],[7

]]

leetcode演算法題庫裡面的46題:

:# 如果滿足滿足結束條件則新增路徑

iflen

(path)

== n:

path_s = path.copy(

)return

for i in

range(0

, n)

:if nums[i]

notin path:

#每個數字只能用一次

# 路徑選擇

)# 回溯

backtrack(path, nums)

# 撤銷路徑

path.pop(

) result =

n =len(nums)

path =

backtrack(path, nums)

return result

[leetcode演算法題庫裡面的47題

:# 如果滿足滿足結束條件則新增路徑

iflen

(path)

== n and path not

in result:

path_s = path.copy(

)return

for i in

range(0

, n)

:# 路徑選擇

# 設定index可以保證不做重複選擇

if i not

in index:

)else

:continue

# 回溯

backtrack(

)# 撤銷選擇

path.pop(

) index.pop(

) result =

n =len(nums)

index =

path =

backtrack(

)return result

參考labuladong的博文

leetcode上的**

leetcode演算法題庫裡面的79題

劍指offer

回溯演算法的原理和示例

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

由素數環思考回溯演算法的實現步驟

素數環,相鄰兩個相加是否為素數,數字範圍 1 20 陣列 和是否素數 回溯,返回到上乙個 public class primering if arr k numlength k numlength 1 if arr k 1 else 判斷當前放進的數字是否符合條件 1.是否與之前重複 2.相鄰之和是...

XOR演算法的原理和實現

當乙個數a和另乙個數b進行異或運算會生成另乙個數c,如果再將c和b進行異或運算則c又會還原為a。相對於其他的簡易加密演算法,xor演算法的優點如下。1 演算法簡單,對於高階語言很容易能實現。2 速度快,可以在任何時候 任何地方使用。3 對任何字元都是有效的,不像有些簡易加密演算法,只對西文字元有效,...